使用 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 在 Postgres 中更新插入

Node.js Sequelize UUID 主键 + Postgres

Node.js:如何在 Sequelize 中使用 Postgres 存储过程?

如何将 postgres 查询分配给 node.js、Discord bot 和 postgres 集成中的变量?

使用 Node.js 和 AWS Lambda 将 S3 文件的内容记录到 postgres 表

AWS:启动启动服务器(Node.js + Postgres)