【问题标题】:bookshelf js save() command not updating rows in postgresql dbbookshelf js save() 命令不更新 postgresql 数据库中的行
【发布时间】:2023-03-25 04:20:01
【问题描述】:

JS 初学者试图通过 bookshelf.js 让 PostgreSQL 数据库与 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: No Rows Updated”

【问题讨论】:

    标签: postgresql bookshelf.js


    【解决方案1】:

    当您创建模型时提供您自己的 id,例如

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

    Bookshelf 假设它是一个更新操作,不是一个插入。它将内部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 描述了这种行为。

    【讨论】:

    • 这让我有一段时间了,我用的是{ insert: true }
    • 我提供了我自己的 id,它也为我解决了这个问题,因为它把它当作更新而不是插入。谢谢!
    【解决方案2】:

    您是否使用 knex 创建了用户表?我能想到的一个潜在问题是,您没有任何实际为 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);
        });
      }
    });
    

    【讨论】:

    • 我试过你的代码,但我得到了同样的错误。我最初有一个更简单的代码版本,我也尝试过手动创建表,所有这些都返回相同的错误消息。我的 PG 设置中可能有任何错误吗?为简单起见,我将所有内容都保留为默认值。
    【解决方案3】:
    new User({id: 2}).
     save().
     then((model) => {
      res.json({ success: true });
    });
    

    【讨论】:

    • 覆盖id 属性(假设它是主键)将导致Bookshelf 尝试更新而不是插入。如果该 id 没有现有记录,这将引发错误。
    • 对不起,我以为他只是想保存数据。我只是试图演示如何保存不更新的数据。感谢您指出,否则会误导他人。
    【解决方案4】:

    不不!新用户返回一个承诺!你不能那样使用它。 试试看

    new User().save()
    

    【讨论】:

    • 不正确。 new User 仅在内存中实例化模型。调用save确实返回一个Promise。 OP 的问题是指定一个主键,它指示 Bookshelf 执行更新而不是插入。
    猜你喜欢
    • 2015-12-29
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2022-06-13
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多