2013-01-15 33 views
8

我在PostgreSQL的9如何防止Sequelize從插入主鍵NULL與Postgres的

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 「死胎」( 「國家」, 「年」, 「伯爵」,」 id「)VALUES('Andhra Pradesh',2004,11,NULL)返回; 無法保存行{「length」:110,「name」:「error」,「severity」:「ERROR」,「code」:「23502」,「file」:「execMain.c」,「line」 :「1359」,「routine」:「ExecConstraints」}

如果你看看它生成的sql,它會爲主鍵理想地由db產生null。

有人可以幫助我,我在這裏失蹤了什麼?

回答

13

你必須實例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

+0

感謝那些與1.5.X版本的工作,令人驚訝的是NPM註冊表https://npmjs.org/package/sequelize犯規提及關於1.5.0版本的任何東西。 – anishek

+1

在命令行上嘗試'npm show sequelize'。 :) – sdepold

+1

此解決方案的問題在於,當您嘗試執行像這樣的user.save({address:null})更新時;它不會更改數據庫中的地址。有沒有辦法執行一個更新set屬性爲null? – lao

1

有不使用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來插入陣列omiting標識的唯一屬性,留下來的DB自動創建ID爲你。 =)

+0

這是作者的建議,謝謝:) – colthreepv

1

爲了擴大sdepold的回答,他建議您可以使用omitNull來防止將null值添加到生成的SQL中。一般來說,這很好,它也允許你執行部分更新。

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

雖然有一個警告。如果你想要做什麼合法的話,你如何設置一列到null?答案是,您可以通過omitNull作爲保存的一部分。

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

OR

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