web-dev-qa-db-ja.com

bookshelf js save()コマンドがpostgresql dbの行を更新しない

JavaScriptの初心者が、bookshelf.jsを介してPostgreSQL DBがexpress.jsと通信できるようにします。

github: https://github.com/duskyshelf/bookers-academy/blob/master/booker.js

var knex = require('knex')({
  client: 'pg',
  connection: "postgres://localhost/bookers"
});

var bookshelf = require('bookshelf')(knex);

var User = bookshelf.Model.extend({
  tableName: 'users'
});

var bob = new User({id: 2});
bob.save()

bookshelf.jsがデータベースにコンテンツを追加できないようです。

現在のエラーメッセージ:「未処理の拒否CustomError:行が更新されていません」

18
David Upsdale

次のように、独自のIDを提供するモデルを作成するとき

_var bob = new User({id: 2});
_

本棚は、それがupdate操作であり、挿入ではないと想定しています。内部のisNew属性をfalseに設定し、save()ではなくINSERT INTO user(id, ...) VALUES (2, ...);が呼び出されると、_UPDATE user ... WHERE id = 2;_を実行します。

_id = 2_のユーザーがいない場合、更新はほとんど静かにDO NOTHINGになります。

強制的に挿入するには、save()を次のように変更する必要があります。

_bob.save(null, {method: 'insert'});
_

Bookshelf save() documentation はこの動作を説明しています。

41
flaviodesousa

Knexを使用してユーザーテーブルを作成しましたか?私が考えることができる1つの潜在的な問題は、実際にPostgres DBのテーブルを作成するロジックがないことです。データベースにテーブルがまだ存在しない場合に作成するサンプルコードを次に示します。

bookshelf.knex.schema.hasTable('User').then(function(exists) {
  if(!exists) {
    bookshelf.knex.schema.createTable('User'), function(user) {
      user.increments('id').primary();
      user.timestamps();
    }).then(function(table){
      console.log('Created Table:', table);
    });
  }
});
0
medhir