Postgresql 错误:无法在准备好的语句中插入多个命令

Postgresql 错误:无法在准备好的语句中插入多个命令,postgresql,Postgresql,我正在尝试将一行从一个表移动到另一个表 问题是,如果我将两个查询放在一起,就会得到“错误:无法将多个命令插入到准备好的语句中”。我能做什么 exports.deletePost = function(id) { return db.query(`INSERT INTO deletedjobs SELECT * FROM jobs WHERE id = $1; DELETE FROM jobs WHERE id = $1;`, [id]).then(res

我正在尝试将一行从一个表移动到另一个表

问题是,如果我将两个查询放在一起,就会得到“错误:无法将多个命令插入到准备好的语句中”。我能做什么

exports.deletePost = function(id) {
    return db.query(`INSERT INTO deletedjobs
    SELECT *
    FROM jobs
    WHERE id = $1;

    DELETE FROM jobs WHERE id = $1;`, [id]).then(results => {
        console.log("succesfull transfer");
        return results.rows[0];
    });
};
  • 也许你不应该使用
    子句,试试分号
  • 您使用了
    select*
    您应该输入列名称,因为在后面的 当您可以添加新列时,您的函数不会执行
编辑:在v7.0.0之后,我发现了
db.multi
可以执行多查询字符串,您可以尝试以下操作:

db.multi(`INSERT INTO deletedjobs
    SELECT *
    FROM jobs
    WHERE id = $1;DELETE FROM jobs WHERE id = $1`, [id])

另一方面,我认为更好的解决方案是,您应该同时将查询包装到一个函数中,以便执行insert delete操作,如下所示:

CREATE函数moveJob(id字符可变)返回void作为
$BODY$
开始
插入到deletedjobs中
挑选*
来自乔布斯
其中id=id;
从id=id的作业中删除;
结束;
$BODY$
语言plpgsql易失性安全定义程序
成本100;
并在js中将其称为postgresql函数:

db.any('select moveJob($1)'[id]);

您也可以将
与。。。AS
子句()一次执行两个查询。所以它可能看起来像这样:

exports.deletePost = function(id) {
return db.query(`
  WITH 
    A AS (SELECT * FROM jobs WHERE id = $1), 
    B AS (INSERT INTO deletedjobs FROM A),
    DELETE FROM jobs WHERE id IN (SELECT id FROM A);
`, [id]).then(results => {
    console.log("succesfull transfer");
    return results.rows[0];
});
};

但当我使用分号时,我得到了这个错误“错误:无法将多个命令插入到准备好的语句中”,谢谢ThnhPhan。我刚刚尝试了您更新的解决方案,但我得到了“db.multi不是函数”我也尝试了在我的终端psql中运行该函数,但我得到了“ERROR:function result type必须指定”:/我已经更新了return in函数,您能不能再试一次Hanks Thanh,现在我创建了该函数,不幸的是,我得到了db.multi/db.any不是一个函数,因为我使用的是这个npm而不是pg-promise。谢谢,我会检查它