2016-10-20 6 views
0

私はpostgresqlでエクスプレス生成テンプレートを使用しています。私は委託と追跡を作成するための2つの残りのルートメソッドを持っています。 しかし、私はそれぞれの委託の挿入に更新されるトラッキングが欲しいが、私はそれを行うためにシリアル主キーが必要です。したがって、createCon関数からは、createConTrackingのcidフィールドに使用するために、挿入後にidを返す必要があります。db insertから別のdb insertに使用するシリアルプライマリキーを返す方法

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($1, $2, ......)', 
    [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($1, $2, $3, $4,$5, $6, $7)', 
    [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); 
    }); 
} 

DB

CREATE TABLE consignments (
    ID SERIAL PRIMARY KEY, 
    conId INTEGER, 
    payTerm VARCHAR, 

CREATE TABLE tracking (
    ID SERIAL PRIMARY KEY, 
    status VARCHAR, 
    remarks VARCHAR, 
    cid INTEGER 
); 
+0

コード例が混乱しています。必要条件は、2つの別々のHTTPハンドラーではなく2つの操作を実行する単一のHTTPハンドラーに対するものです。 –

答えて

1

私はpg-promiseの著者です。


データを変更する場合、データ、またはトランザクション(メソッドtx)を変更しないときは、タスク(メソッドtask)内で複数のクエリを実行する必要があります。そして、あなたの例のように、データベースに2つの変更を加える場合、トランザクションでなければなりません。

最初の挿入クエリにRETURNING idを追加し、方法oneを使用して、1つの行が戻ってくることを示します。

function myRequestHandler(req, res, next) { 
    db.tx(function (t) { 
     return t.one('INSERT INTO consignments(...) VALUES(...) RETURNING id', [param1, etc], c => +c.id) 
      .then(function (id) { 
       return t.none('INSERT INTO tracking(...) VALUES(...)', [id, etc]); 
      }); 
    }) 
     .then(function() { 
      res.status(200) 
       .json({ 
        status: 'success', 
        message: 'Inserted a consignment + tracking' 
       }); 
     }) 
     .catch(function (error) { 
      return next(error); 
     }); 
} 

上記の例では、トランザクション内で2つのクエリを実行します。また、最初のクエリでは、簡単な戻り値変換に3番目のパラメータを使用し、さらに変換(BIGSERIALのような64ビットの場合)を使用します。

1

は、単にあなたのINSERTステートメントにRETURNING句を追加

ルート/ index.jsファイル。この句を使用すると、挿入されたレコードの実際の値に関するデータを返すことができます。

insert into consignments(conid, payterm,........) 
values($1, $2, ......) 
returning id; 
+0

答えに加えて、あなたのクエリが何かを返す場合、 'db.none(...)'メソッドを使わなくていいと言っています。 –

関連する問題