11

我在 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,它会将 null 作为主键,理想情况下应该由 db 生成。

有人可以帮助我了解我在这里缺少什么吗?

4

4 回答 4

20

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

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

于 2013-01-15T07:37:04.997 回答
4

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});
于 2015-10-05T21:12:51.663 回答
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。=)

于 2014-08-02T14:32:21.073 回答
2

也可以通过 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 }
})
于 2018-11-16T10:22:23.277 回答