[英]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.