2013-01-15 36 views
8

Tôi đã tạo ra một bảng trong postgresql 9Làm thế nào để ngăn chặn Sequelize từ chèn NULL cho khóa chính với Postgres

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

cố gắng để viết một mẫu trên Node.js với phiên bản sequelize 1.4.1.

ánh xạ bảng trên như

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

bây giờ khi tôi cố gắng để tạo ra một thể hiện mới của thai chết lưu và lưu nó, tôi nhận lỗi.

/** dụ mới tạo mã **/

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

lỗi tôi nhận được

* Thi công: INSERT INTO "thai chết lưu" ("nhà nước", "năm", "đếm"," id ") VALUES ('Andhra Pradesh', 2004,11, NULL) RETURNING ; không thể lưu hàng {"độ dài": 110, "tên": "lỗi", "mức độ nghiêm trọng": "L ERI", "mã": "23502", "tệp": "execMain.c", "dòng" : "1359", "thường lệ": "ExecConstraints"}

Nếu bạn nhìn vào sql mà nó tạo ra, nó đặt null cho khóa chính mà lý tưởng nên được tạo bởi db.

Ai đó có thể giúp tôi về những gì tôi bị thiếu ở đây không?

Trả lời

13

Bạn phải nhanh chóng Sequelize với một lá cờ đặc biệt gọi là omitNull:

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

này sẽ disable inserting undefined values as NULL. http://sequelizejs.com/#usage-options

Bạn có thể cần phải cập nhật để v1.5.x hoặc 1.6.0-betaX

+0

Cảm ơn mà làm việc với các phiên bản 1.5.x, đáng ngạc nhiên là NPM registry https://npmjs.org/package/sequelize doesnt đề cập đến bất cứ điều gì về phiên bản 1.5.0. – anishek

+1

thử 'npm show sequelize' trên dòng lệnh. :) – sdepold

+1

Vấn đề với giải pháp này là khi bạn cố gắng thực hiện cập nhật như user.save này ({address: null}); nó không thay đổi địa chỉ trong DB. Có cách nào để thực hiện một cập nhật một thiết lập một thuộc tính để null? – lao

1

Có một workaround này mà không sử dụng omitNull.

Chỉ cần làm điều này:

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

Bằng cách gửi một loạt các thuộc tính như tham số cho phương pháp tiết kiệm bạn buộc sequelize để chèn chỉ các thuộc tính của mảng omiting id, để lại cho DB để tự động tạo id cho bạn. =)

+0

đây là cách tác giả gợi ý, vì vậy cảm ơn :) – colthreepv

1

Để mở rộng câu trả lời từ sdepold, như được khuyến nghị, bạn có thể omitNull để ngăn phần tiếp theo thêm giá trị null vào SQL được tạo. Nói chung, điều này là tốt, và nó cũng cho phép bạn thực hiện cập nhật từng phần.

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

Có một thông báo trước. Làm thế nào để bạn thiết lập một cột để null nếu đó là hợp pháp những gì bạn muốn làm gì ?? Câu trả lời là bạn có thể vượt qua omitNull như một phần lưu của bạn.

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

HOẶC

user.update({address: null}, {omitNull: false}); 
Các vấn đề liên quan