【问题标题】:How to prevent Sequelize from inserting NULL for primary keys with Postgres如何防止 Sequelize 使用 Postgres 为主键插入 NULL
【发布时间】:2012-12-29 05:38:45
【问题描述】:

我在 postgresql 9 中创建了一个表

create table stillbirth(id serial primary key, state varchar(100), count int not null, year int not null); 

尝试使用 sequelize 1.4.1 版本在 node.js 上编写示例。

将上表映射为

var StillBirth = sequelize.define('stillbirth',
{ id: {type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true},
state: Sequelize.STRING,
year: Sequelize.INTEGER,
count: Sequelize.INTEGER
}, {timestamps: false, freezeTableName: true});

现在当我尝试创建一个死胎的新实例并保存它时,我得到了错误。

/** 新实例创建代码**/

StillBirth
   .build({state: objs[j].state, year: objs[j].year, count: objs[j].count})
   .save()
   .error(function(row){
         console.log('could not save the row ' + JSON.stringify(row));
        })
   .success(function(row){
       console.log('successfully saved ' + JSON.stringify(row));
   })

我得到的错误

*执行:INSERT INTO "stillbirth" ("state","year","count","id") VALUES ('Andhra Pradesh',2004,11,NULL) RETURNING ; 无法保存行 {"length":110,"name":"error","severity":"ERROR","code":"23502","file":"execMain.c","line": "1359","例程":"ExecConstraints"}

如果您查看它生成的 sql,它会将空值作为主键,理想情况下应该由 db 生成。

有人可以帮我看看我在这里缺少什么吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    您必须使用名为 omitNull 的特殊标志来实例化 Sequelize:

    var sequelize = new Sequelize('db', 'user', 'pw', {
      omitNull: true
    })
    

    这将是disable inserting undefined values as NULLhttp://sequelizejs.com/#usage-options

    您可能需要更新到 v1.5.x 或 1.6.0-betaX

    【讨论】:

    • 感谢使用 1.5.x 版本,令人惊讶的是 NPM 注册表 npmjs.org/package/sequelize 没有提及任何关于 1.5.0 版本的信息。
    • 此解决方案的问题在于,当您尝试执行这样的更新时 user.save({address:null});它不会更改数据库中的地址。有什么方法可以执行更新并将属性设置为 null?
    • 鉴于他们的文档变异率,该链接早已失效。当然想知道这是怎么回事,因为它刚刚开始发生在我身上,我想知道为什么。
    • @lao,这是一个全局设置。您始终可以传递本地覆盖:user.save({address:null}, {omitNull: false})
    • 靶心!谢谢
    【解决方案2】:

    有一个不使用 omitNull 的解决方法。

    这样做:

    StillBirth
       .build({state: objs[j].state, year: objs[j].year, count: objs[j].count})
       .save(['state','year','count'])
       .error(function(row){
             console.log('could not save the row ' + JSON.stringify(row));
            })
       .success(function(row){
           console.log('successfully saved ' + JSON.stringify(row));
       })
    

    通过发送属性数组作为 save 方法的参数,您可以强制 sequelize 仅插入该数组的属性而忽略 id,让 DB 自动为您创建 id。 =)

    【讨论】:

      【解决方案3】:

      要扩展来自sdepold 的答案,按照他的建议,您可以omitNull 以防止sequelize 将null 值添加到生成的SQL 中。总的来说,这很好,它还允许您执行部分更新。

      var sequelize = new Sequelize('db', 'user', 'pw', {
        omitNull: true
      })
      

      不过,有一个警告。如果您合法地想要这样做,您如何将列设置为null?答案是您可以在保存过程中传递omitNull

      user.address = null;
      user.save({omitNull: false});
      

      user.update({address: null}, {omitNull: false});
      

      【讨论】:

        【解决方案4】:

        还可以通过 create 方法定义可以设置哪些属性。例如,使用它可以让你限制 User 模型只设置用户名和地址,而不是管理员标志:

        User.create({ username: 'barfooz', isAdmin: true }, { fields: [ 'username' ] }).then(user => {
          // let's assume the default of isAdmin is false:
          console.log(user.get({
            plain: true
          })) // => { username: 'barfooz', isAdmin: false }
        })
        

        【讨论】:

          猜你喜欢
          • 2013-06-17
          • 1970-01-01
          • 2018-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多