如何 return 来自数据库插入的串行主键用于另一个数据库插入
How to return the serial primary key from a db insert to use for another db insert
我在 postgresql 中使用快速生成的模板,我有 2 个用于创建托运和跟踪的剩余路线方法。
但是我想在每个托运插入物上更新跟踪,但我需要串行主键来完成它。因此,从 createCon 函数我需要它 return 插入后的 id,用于 createConTracking 中的 cid 字段。
routes/index.js文件
var db = require('../queries');
router.post('/api/cons', db.createCon);
router.post('/api/cons/:id/tracking', db.createConTracking);
queries.js
var promise = require('bluebird');
var options = {
promiseLib: promise
};
var pgp = require('pg-promise')(options);
var db = pgp(connectionString);
function createCon(req, res, next) {
var conid = parseInt(req.body.conid);
db.none('insert into consignments(conid, payterm,........)'+
'values(, , ......)',
[conid, req.body.payterm,........])
.then(function () {
res.status(200)
.json({
status: 'success',
message: 'Inserted one con'
});
})
.catch(function (err) {
return next(err);
});
}
function createConTracking(req, res, next) {
var cid = parseInt(req.params.id);
var userid = req.user.email;
var conid = parseInt(req.body.conid);
db.none('insert into tracking(status, remarks, depot, userid, date, cid, conid)'+
'values(, , , ,, , )',
[req.body.status, req.body.remarks, req.body.depot, userid, req.body.date, cid, conid])
.then(function (data) {
res.status(200)
.json({
data: data,
status: 'success',
message: 'Updated Tracking'
});
})
.catch(function (err) {
return next(err);
});
}
数据库
CREATE TABLE consignments (
ID SERIAL PRIMARY KEY,
conId INTEGER,
payTerm VARCHAR,
CREATE TABLE tracking (
ID SERIAL PRIMARY KEY,
status VARCHAR,
remarks VARCHAR,
cid INTEGER
);
只需添加一个RETURNING
clause to your INSERT
语句。此子句允许您 return 有关插入记录中实际值的数据。
insert into consignments(conid, payterm,........)
values(, , ......)
returning id;
我是 pg-promise 的作者。
更改数据时,您应该在一个任务(方法task) when not changing data, or transaction (method tx)中执行多个查询。如果对数据库进行两次更改,就像在您的示例中一样,它应该是一个事务。
您可以将 RETURNING id
附加到您的第一个插入查询,然后使用方法 one 来表明您希望返回一行。
function myRequestHandler(req, res, next) {
db.tx(async t => {
const id = await t.one('INSERT INTO consignments(...) VALUES(...) RETURNING id', [param1, etc], c => +c.id);
return t.none('INSERT INTO tracking(...) VALUES(...)', [id, etc]);
})
.then(() => {
res.status(200)
.json({
status: 'success',
message: 'Inserted a consignment + tracking'
});
})
.catch(error => {
return next(error);
});
}
在上面的示例中,我们在一个事务中执行了两个查询。对于第一个查询,我们使用第三个参数进行简单的 return 值转换,加上转换(如果它是像 BIGSERIAL
这样的 64 位)。
我在 postgresql 中使用快速生成的模板,我有 2 个用于创建托运和跟踪的剩余路线方法。 但是我想在每个托运插入物上更新跟踪,但我需要串行主键来完成它。因此,从 createCon 函数我需要它 return 插入后的 id,用于 createConTracking 中的 cid 字段。
routes/index.js文件
var db = require('../queries');
router.post('/api/cons', db.createCon);
router.post('/api/cons/:id/tracking', db.createConTracking);
queries.js
var promise = require('bluebird');
var options = {
promiseLib: promise
};
var pgp = require('pg-promise')(options);
var db = pgp(connectionString);
function createCon(req, res, next) {
var conid = parseInt(req.body.conid);
db.none('insert into consignments(conid, payterm,........)'+
'values(, , ......)',
[conid, req.body.payterm,........])
.then(function () {
res.status(200)
.json({
status: 'success',
message: 'Inserted one con'
});
})
.catch(function (err) {
return next(err);
});
}
function createConTracking(req, res, next) {
var cid = parseInt(req.params.id);
var userid = req.user.email;
var conid = parseInt(req.body.conid);
db.none('insert into tracking(status, remarks, depot, userid, date, cid, conid)'+
'values(, , , ,, , )',
[req.body.status, req.body.remarks, req.body.depot, userid, req.body.date, cid, conid])
.then(function (data) {
res.status(200)
.json({
data: data,
status: 'success',
message: 'Updated Tracking'
});
})
.catch(function (err) {
return next(err);
});
}
数据库
CREATE TABLE consignments (
ID SERIAL PRIMARY KEY,
conId INTEGER,
payTerm VARCHAR,
CREATE TABLE tracking (
ID SERIAL PRIMARY KEY,
status VARCHAR,
remarks VARCHAR,
cid INTEGER
);
只需添加一个RETURNING
clause to your INSERT
语句。此子句允许您 return 有关插入记录中实际值的数据。
insert into consignments(conid, payterm,........)
values(, , ......)
returning id;
我是 pg-promise 的作者。
更改数据时,您应该在一个任务(方法task) when not changing data, or transaction (method tx)中执行多个查询。如果对数据库进行两次更改,就像在您的示例中一样,它应该是一个事务。
您可以将 RETURNING id
附加到您的第一个插入查询,然后使用方法 one 来表明您希望返回一行。
function myRequestHandler(req, res, next) {
db.tx(async t => {
const id = await t.one('INSERT INTO consignments(...) VALUES(...) RETURNING id', [param1, etc], c => +c.id);
return t.none('INSERT INTO tracking(...) VALUES(...)', [id, etc]);
})
.then(() => {
res.status(200)
.json({
status: 'success',
message: 'Inserted a consignment + tracking'
});
})
.catch(error => {
return next(error);
});
}
在上面的示例中,我们在一个事务中执行了两个查询。对于第一个查询,我们使用第三个参数进行简单的 return 值转换,加上转换(如果它是像 BIGSERIAL
这样的 64 位)。