0

pg-promiseでは、主キーがシリアル型の場合、どのようにデータを挿入できますか? フィールド ID を省略すると、呼び出しで応答が作成されません。

以下のコードは、catch でエラーを生成しません (また、thenブランチも実行しません)。

function postSecao(req, res){
  var data = req.body;
  var db = pgp(cn);
  db.none("insert into public.secoes(nome) values($1)", [data.nome])
  .then(function () {
      pgp.end();
      return res.status(201).end();
  })
  .catch(function (error) {
      console.log(err);
      pgp.end();
      return res.status(500).end();
  });

}

テーブル:

CREATE TABLE public.secoes
(
  id bigint NOT NULL DEFAULT nextval('secoes_id_seq'::regclass),
  nome character varying(100),
  CONSTRAINT id PRIMARY KEY (id)
)

手動で ID を指定しても問題ありません。

function postSecao(req, res){
  var data = req.body;
  var db = pgp(cn);
  db.none("insert into public.secoes(id, nome) values($1,$2)", [data.id, data.nome])
  .then(function () {
      pgp.end();
      return res.status(201).end();
  })
  .catch(function (error) {
      console.log(err);
      pgp.end();
      return res.status(500).end();
  });

}

もちろん、SQL は PGAdmin で正常に実行されます。

insert into public.secoes(nome) values('test')
4

1 に答える 1

1

私はちょうど理解しました。問題は、ユーザーの権限制御にありました。DB にアクセスするユーザーは、シリアル フィールドで使用されるシーケンスに対する権限を持っている必要があります。

したがって、pg-promiseの問題ではありません。

于 2016-04-24T20:54:59.907 に答える