使用 postgres 和 node js 在单个语句中执行多个查询
Posted
技术标签:
【中文标题】使用 postgres 和 node js 在单个语句中执行多个查询【英文标题】:Execute multiple queries in a single statement using postgres and node js 【发布时间】:2016-06-08 02:42:24 【问题描述】:我需要像这样在单个语句中执行插入和删除查询
INSERT INTO COMPANY (ID,NAME) VALUES (1, 'Paul');DELETE FROM COMPANY WHERE ID='12';
这是我用于执行查询的 node.js 代码
pg.connect(pgConString, function (err, client, done)
if (err)
callBack("DB connection failed. " + err, null);
return;
var query = client.query(
text: "INSERT INTO COMPANY (ID,NAME) VALUES (1, 'Paul');DELETE FROM COMPANY WHERE ID='12';"
values: [1, "Poul1"],
name: "insertQuery"
);
query.on("error", function (err)
callBack("DB insertion failed. Error Message: " + err, null);
return;
);
query.on('end', function (result)
done();
return;
);
);
我收到这样的错误消息
错误:无法在准备好的语句中插入多个命令
是否可以使用 node.js 在 postgresql 数据库中执行多个查询?
【问题讨论】:
你试过了吗?你有什么错误吗? 尝试没有准备的没有准备的语句 您可能想研究使用 Postgres FUNCTION。 postgresqltutorial.com/postgresql-create-function 【参考方案1】:虽然有一个公认的答案,但它有点过时了。现在 node-postgres 在一次调用中处理多个查询并返回一个整洁的小数组给你,比如:
const db.query('select 1; select 2; select 3;')
results.map(r => (r.rows[0]['?column?']))
// [ 1, 2, 3 ]
还有一个名为 pg-promise 的替代“意见”库,它也可以在一次调用中接受查询链,并且也可以处理 sql
文件。
【讨论】:
因为你的回答,我也为pg-promise
添加了一个:)
请注意,问题在查询期间使用参数。它是否也可以使用参数而不首先使用 pg-format
之类的东西构建查询【参考方案2】:
这样试试
pg.connect(pgConString, function (err, client, done)
if (err)
callBack("DB connection failed. " + err, null);
return;
client.query(
text: "INSERT INTO COMPANY (ID,NAME) VALUES (1, 'Paul');",
values: [1, "Poul1"],
name: "insertQuery"
);
client.query(
text: "DELETE FROM COMPANY WHERE ID='12';",
name: "deleteQuery"
);
client.on("error", function (err)
callBack("DB insertion failed. Error Message: " + err, null);
return;
);
);
【讨论】:
警告:因为上面的每个查询都是异步操作,所以您不能指望它们按所写的顺序完成。如果不需要控制流量,那就没问题了。但如果是这样,请使用回调、承诺或异步/等待来控制流程。 node-postgres docs 中的示例 @DILP 鉴于同一客户端(连接)上的查询由 node-postgres 排队,因此实际上保证了顺序。但是您仍然希望按顺序等待它们,这是真的。【参考方案3】:当使用pg-promise...
首先,我们通过灵活的QueryFormat 列表声明我们的查询 + 值:
const queries = [
query: 'select * from products where price > $1', values: [12.5],
query: 'select * from payments where amount < $amount', values: amount
];
然后我们创建一个单查询格式化字符串:
const sql = pgp.helpers.concat(queries);
然后我们执行它,并检索结果:
const [products, payments] = await db.multi(sql);
请参阅:concat、multi。
【讨论】:
以上是关于使用 postgres 和 node js 在单个语句中执行多个查询的主要内容,如果未能解决你的问题,请参考以下文章
Node.js Sequelize UUID 主键 + Postgres
Node.js:如何在 Sequelize 中使用 Postgres 存储过程?
如何将 postgres 查询分配给 node.js、Discord bot 和 postgres 集成中的变量?