2013-04-01 25 views
29

Tài liệu của Sequelize không nói nhiều về số autoIncrement. Nó chỉ bao gồm các ví dụ sau:AutoIncrement hoạt động như thế nào trong Sequelize của NodeJs?

// autoIncrement can be used to create auto_incrementing integer columns 
incrementMe: { type: Sequelize.INTEGER, autoIncrement: true } 

Dựa tắt của ví dụ này tôi có đoạn mã sau:

db.define('Entries', { 
    id: { 
     type: Seq.INTEGER, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    title: { 
     type: Seq.STRING, 
     allowNull: false 
    }, 
    entry: { 
     type: Seq.TEXT, 
     allowNull: false 
    } 
} 

Bây giờ khi tôi muốn tạo một mục tôi muốn làm một cái gì đó như thế này:

models.Entry.create({title:'first entry', entry:'yada yada yada'}) 

Tuy nhiên, khi tôi thực thi mã mà tôi nhận được một lỗi cơ sở dữ liệu:

Null value in column "id" violates not null constraint

Tôi cho rằng Sequelize sẽ đặt số nguyên vào cho tôi hoặc xác định bảng cơ sở dữ liệu để thực hiện điều đó. Dường như không? Tôi đang thiếu gì ở đây để đảm bảo rằng id được tự động tăng lên và được lấp đầy?

Cảm ơn nhiều.

Trả lời

14

thường Sequelize.js tự điều chỉnh chính nó bằng databse. Vì vậy, thuộc tính autoincrement tương ứng với một kiểu nối tiếp trong PostgreSQL.

Tôi đã làm việc với Sequelize và những gì tôi nhớ là bạn không cần chỉ định id làm khóa chính. Phần tiếp theo sẽ làm điều đó cho bạn.

Cố gắng không thêm thuộc tính id và xem phần tiếp theo sẽ không thêm thuộc tính đó cho bạn hay không.

+0

xin lỗi chuyển ưu tiên dự án, nhưng tôi sẽ lấy lại cho bạn cuối tuần này về điều này –

+1

điều này phù hợp với mục đích của tôi, nhưng vẫn tự hỏi mục đích của 'autoIncrement' là gì nếu bạn phải nhập nó mọi lúc. Có lẽ tôi đã cấu hình sai. –

+0

sự cố là cách cung cấp tên khóa chính tùy chỉnh! –

8

omitNull tùy chọn cấu hình theo mặc định là sai. Thiết lập nó là true, và id sẽ được đưa về chăm sóc bởi Postgres:

sequelize = new Sequelize('mydb', 'postgres', null, { 
    host: 'localhost', 
    port: 5432, 
    dialect: 'postgres', 
    omitNull: true 
}) 

Visitor = sequelize.define('visitor', { 
    email: Sequelize.STRING 
}) 

Visitor.create({email: '[email protected]'}) 
+5

Theo [vấn đề được báo cáo này] (https://github.com/sequelize/sequelize/issues/2813), 'omitNull' sẽ không còn được sử dụng nữa. Sử dụng 'autoIncrement: true' thay cho cột tương ứng ở định nghĩa mô hình và đơn giản là không cung cấp giá trị khi bạn thực hiện' create() '. –

+0

@ThalisK. : Điều này không hiệu quả với tôi. Có cùng một vấn đề với tư cách tác giả. – akohout

+0

@mxgrn, nhờ công trình của nó cho tôi, nếu bạn không ommit null giá trị, postgresql sẽ đặt giá trị null bên trong tuyên bố. https://github.com/sequelize/sequelize/issues/925 –

0

Nó làm việc cho tôi nếu tôi thêm manualy trường "id" (trong trường hợp này Sequelize sẽ không thêm nó automaticaly) trong mô hình như thế này:

Visitor = sequelize.define('visitor', { 
    id: { 
     type: Sequelize.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    email: Sequelize.STRING 
}) 

kết quả lệnh SQL là: "CREATE TABLE IF NOT EXISTS "truy cập"(" id "SERIAL, "email" varchar (255) ..."

Các vấn đề liên quan