PostgreSQL Node.js 服务器中的 SQLite3 each() 函数的等价物?

Posted

技术标签:

【中文标题】PostgreSQL Node.js 服务器中的 SQLite3 each() 函数的等价物?【英文标题】:Equivalent of SQLite3 each() function in PostgreSQL Node.js server? 【发布时间】:2021-07-18 03:23:56 【问题描述】:

所以我正在将 Node.js 应用程序中的数据库从 SQLite3 转换为 PostgreSQL。最初,我的数据库等于:

let db = new sqlite3.Database('./dbName.db', (err) => 
   if (err) 
     return console.error(err.message);
   
   console.log("Connected to database");
);

当我想从表中查询数据时,我可以调用 db.each() 。在 PostgreSQL 中,我正在设置数据库:

const db = new Client(
  user: 'myName',
  host: 'hostName',
  database: 'databaseName',
  password: 'password',
  port: ####,
);

我的原始实现 (SQLite3) 的查询代码是异步函数请求的一部分:

function featureArrayHelper() 
  return new Promise((resolve, reject) => 
    let featureArray = []
    let passedInVar = passedInVarValue

    db.each('SELECT rowid,* FROM table WHERE var4 > (?)', [passedInVar], (err, row) => 
      if (err) 
        reject(err)
       else 
        let jsonObject = 
          var1: row.var1,
          var2 : row.var2,
          var3 : row.var3,
          var4 : row.var4,
          var5: 0
      
      featureArray.push(jsonObject)
    
  , (err, n) => 
    if (err) 
      reject(err)
     else 
      resolve(featureArray)
    
  );
)

实际发布请求的位置:

app.post('/', async function(request, response) 
  const featureArray = await featureArrayHelper()
  response.send(JSON.stringify(featureArray))
);

在这个实现中,当我尝试将 Node 应用程序部署到 Heroku 时,我在尝试调用 db.each() 的行上遇到错误,那么我可以用什么替换它以保留在SQLite3 版本?

【问题讨论】:

您能否提供相关的查询代码以及您为新的 postgres API 尝试了什么?你为 postgres 使用什么库,他们的 API 文档怎么说?您是否尝试过像knex 这样的通用方法,以便更轻松地移植? @Matt 我将查询代码放在问题中。老实说,我是 PostgreSQL 的新手,所以我什至不确定我的服务器设置是否正确,但这只是一个语法问题,我相信一旦解决了它,我就会弄清楚它是否设置正确。 “更容易移植”是什么意思? “端口”是一个术语,用于表示您正在做的事情,将代码从一个系统移动到另一个系统,而不会改变太多功能。 【参考方案1】:

Postgres pg 使用 client.query 并且不提供内置函数来循环遍历行。 javascript 提供了多种处理数组的方法,例如rows.map() 返回一个新的、修改后的数组或rows.each() 将与发布的代码一样工作。

async function featureArrayHelper() 
  let var4 = value4 // not sure what this was for, maybe `passedInVar`?

  const query =  
    text: 'SELECT * FROM table WHERE var4 > $1',
    values: [ passedInVar ],
  
  const res = await db.query(query)
  return res.rows.map(row => 
    return 
      var1: row.var1,
      var2: row.var2,
      var3: row.var3,
      var4: row.var4,
      var5: 0
    
  )

Knex 是一个查询构建器,旨在位于多种类型的数据库之上,因此您不必经历太多来更改数据库(“移植”)。 sqlite 和 postgres 的查询/代码相同,只是连接设置不同。

async function featureArrayHelper(passedInVar) 
  const rows = await knex.select('*')
     .from('table')
     .where( var4: passedInVar )
  return rows.map(row => 
    return 
      var1: row.var1,
      var2: row.var2,
      var3: row.var3,
      var4: row.var4,
      var5: 0
    
  )

对于更高级的查询,您最终可能会得到一些数据库细节,但 knex 会掩盖很多这些差异。

【讨论】:

嗨,马特,对不起,我没有更具体——featureArrayHelper() 函数是用 await 调用的函数,它包含在一个更大的 POST 异步函数中,我有一个将您的代码转换为我当前的设置有点麻烦 - 我将如何修改它以使其工作? 我还编辑了原始问题以包含相关代码 :-) 谢谢

以上是关于PostgreSQL Node.js 服务器中的 SQLite3 each() 函数的等价物?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 node.js 中的 postgresql 脚本中读取

使用 Node JS 连接到在线托管的 PostgreSQL

Node.js、PostgreSQL 中的事务冲突、乐观并发控制和事务重试

使用 Node.js/Sequelize 进行批量插入时 PostgreSQL 崩溃

Node.js等待postgresql错误

Node.js 速递 |尝试获取 JSON 时始终为 null