autoIncrement如何在NodeJs的Sequelize中工作?

时间:2013-04-01 05:12:57

标签: node.js postgresql-9.1 auto-increment sequelize.js

Sequelize的文档并没有详及autoIncrement。它只包括以下示例:

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

基于此示例,我有以下代码:

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

现在,当我想创建一个条目时,我想做这样的事情:

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

但是,当我执行该代码时,我收到数据库错误:

  

列“id”中的空值违反非空约束

我认为Sequelize会为我设置整数或定义数据库表来自己完成。显然不是?我在这里缺少什么来确保id自动递增和填充?

非常感谢。

5 个答案:

答案 0 :(得分:21)

通常Sequelize.js会自行调整数据库。因此,autoincrement属性对应于PostgreSQL中的串行类型。

我已经使用过Sequelize,我记得你不需要将id指定为主键。 Sequelize会为你做。

尝试不添加id属性,看看Sequelize是否会为你添加它。

答案 1 :(得分:9)

默认情况下,

omitNull配置选项为false。将其设置为true,id将由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: 'foo@bar.com'})

答案 2 :(得分:1)

在我的情况下,问题在于表定义未更新。如果没有有价值的数据,请尝试删除该表,然后让Sequelize重新创建该表。

答案 3 :(得分:0)

如果我在这样的模型中添加了“id”字段(在这种情况下Sequelize不会自动添加它),它对我有用:

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

结果SQL命令是:“CREATE TABLE IF NOT NOT EXISTS”visitor“(”id“SERIAL,”email“varchar(255)...”

答案 4 :(得分:0)

就我而言,这是因为我指定了 autoincrement: true 而不是 autoIncrement: true

值得检查您是否仍然遇到问题。表需要删除和重建才能工作。