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

我已经在postgresql 9中创build了一个表

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

试图在node.js上用sequelize 1.4.1版本编写一个示例。

将上表映射为

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

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

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

 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“死胎”(“国家”,“年”,“计数”,“ID”)值('安得拉邦',2004,11,NULL)RETURNING ; 无法保存行{“length”:110,“name”:“error”,“severity”:“ERROR”,“code”:“23502”,“file”:“execMain.c”,“line” “1359”, “程序”: “ExecConstraints”}

如果你看看它生成的SQL,它会为数据库理想的主键提供空值。

有人可以帮助我,我在这里错过了什么?

你必须用名为omitNull的特殊标志来实例化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

有一个解决方法,这不使用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)); }) 

通过发送一个属性数组作为保存方法的参数,您可以强制sequelize仅插入该数组的属性,省略id,留给数据库自动为您创buildid。 =)

为了扩大从sdepold的答案,他build议,你可以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});