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 中的事务冲突、乐观并发控制和事务重试