简体   繁体   English

相当于 SQLite3 each() function 在 PostgreSQL Node.js 服务器?

[英]Equivalent of SQLite3 each() function in PostgreSQL Node.js server?

So I'm converting from database in a Node.js app from SQLite3 to PostgreSQL.因此,我正在将 Node.js 应用程序中的数据库从 SQLite3 转换为 PostgreSQL。 Originally, I had my database equal to something like:最初,我的数据库等于:

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

I was able to call db.each() on it when I wanted to query data from the table.当我想从表中查询数据时,我可以调用 db.each() 。 In PostgreSQL, I'm setting up the database with:在 PostgreSQL 中,我正在设置数据库:

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

My query code for the original implementation (SQLite3) was part of an async function request:我的原始实现(SQLite3)的查询代码是异步 function 请求的一部分:

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)
    }
  });
})
}

where the actual post request was:实际的发布请求是:

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

In this implementation, when I try to deploy the Node app to Heroku, I get an error on a line where I try to call db.each(), so what can I replace it with to retain the functionality established in the SQLite3 version?在这个实现中,当我尝试将 Node 应用程序部署到 Heroku 时,我在尝试调用 db.each() 的行上出现错误,那么我可以用什么替换它以保留 SQLite3 版本中建立的功能?

Postgres pg uses client.query and doesn't provide a built in function to loop through rows. Postgres pg使用client.query并且不提供内置的 function 来循环遍历行。 Javascript provides multiple ways to handle arrays, for example rows.map() returns a new, modified array or rows.each() will work the same as the posted code. Javascript 提供了多种处理 arrays 的方法,例如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 is a query builder, designed to sit atop multiple types of database so you don't have to go through as much to change databases ("porting"). Knex是一个查询构建器,旨在位于多种类型的数据库之上,因此您不必通过 go 来更改数据库(“移植”)。 The query/code is the same for both sqlite and postgres, only the connection setup differs. 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
    }
  })
}

For more advanced queries you will likely end up with some database specifics, but knex will cover up a lot of those differences.对于更高级的查询,您可能最终会得到一些数据库细节,但 knex 会掩盖很多这些差异。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM