如何防止Sequelize使用Postgres为主键插入NULL

时间:2013-01-15 06:41:03

标签: node.js postgresql sequelize.js

我在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实例并保存它时,我会收到错误。

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

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”(“州”,“年”,“计数”,“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 个答案:

答案 0 :(得分:17)

你必须使用一个名为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 :(得分:3)

为了扩展来自sdepold的答案,正如他所建议的那样,您可以omitNull阻止续集将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});

OR

SELECT
  C.Class
  , S.City
  , COUNT(S.*) AS Count
FROM
  Classes AS C INNER JOIN 
  Students AS S ON C.Project_Group = S.Project_Group
GROUP BY
  C.Class
  , S.City

答案 2 :(得分: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 :(得分:0)

也可以定义可以通过create方法设置的属性。例如,使用该命令可以将User模型限制为仅设置用户名和地址,而不能设置admin标志:

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 }
})