如何在 pg-promise 的多行插入中插入带有 nextval 函数的整数
How to insert an integer with nextval function in an multirow insert in pg-promise
是否可以在 pg-promise 多行插入中使用 nextval 函数?
我有一个数据库(遗憾的是我无法更改),必须像这样通过客户端插入 ID:
INSERT INTO some_object (object_id, object_name)
VALUES (nextval('some_object_seq'), ${object_name})
RETURNING object_id;
这适用于一个插入。但是现在我必须一次插入多行并尝试 pgp.helpers.insert:
const cs = pgp.helpers.ColumnSet(['object_id', 'object_name'], { table });
const query = pgp.helpers.insert(values, cs) + 'RETURNING object_id';
database.many(query).then(data => {
return data
}).catch(error => {
logger.error(error, query);
});
有什么方法可以在这种情况下使用 nextval('some_object_seq') 吗?遗憾的是,我无法更改 table 定义中 id 列的默认值。
正如 Bergi 所写,可以像这样向列集添加默认表达式:
const cs = pgp.helpers.ColumnSet(
[{
name: "object_id",
// setting the DEFAULT value for this column
def: "nextval('some_object_seq')",
// use raw-text modifier to inject string directly
mod: "^",
}, 'object_name'], { table });
您的列应定义为:
{
name: `object_id`,
init: () => `nextval('some_object_seq')`,
mod: `:raw`
}
与@baal 的回答相反,您不需要使用 def
,因为您没有提供默认值,而是完全覆盖该值,这就是 init
为.
它也可以在 upsert 查询中使用。
是否可以在 pg-promise 多行插入中使用 nextval 函数? 我有一个数据库(遗憾的是我无法更改),必须像这样通过客户端插入 ID:
INSERT INTO some_object (object_id, object_name)
VALUES (nextval('some_object_seq'), ${object_name})
RETURNING object_id;
这适用于一个插入。但是现在我必须一次插入多行并尝试 pgp.helpers.insert:
const cs = pgp.helpers.ColumnSet(['object_id', 'object_name'], { table });
const query = pgp.helpers.insert(values, cs) + 'RETURNING object_id';
database.many(query).then(data => {
return data
}).catch(error => {
logger.error(error, query);
});
有什么方法可以在这种情况下使用 nextval('some_object_seq') 吗?遗憾的是,我无法更改 table 定义中 id 列的默认值。
正如 Bergi 所写,可以像这样向列集添加默认表达式:
const cs = pgp.helpers.ColumnSet(
[{
name: "object_id",
// setting the DEFAULT value for this column
def: "nextval('some_object_seq')",
// use raw-text modifier to inject string directly
mod: "^",
}, 'object_name'], { table });
您的列应定义为:
{
name: `object_id`,
init: () => `nextval('some_object_seq')`,
mod: `:raw`
}
与@baal 的回答相反,您不需要使用 def
,因为您没有提供默认值,而是完全覆盖该值,这就是 init
为.
它也可以在 upsert 查询中使用。