41

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 自动递增和填充?

非常感谢。

4

5 回答 5

31

通常 Sequelize.js 会适应数据库。所以autoincrement属性对应PostgreSQL中的一个serial类型。

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

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

于 2013-04-01T11:52:39.887 回答
13

omitNullconfig 选项默认为 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'})
于 2013-08-30T06:17:24.123 回答
5

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

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

生成的 SQL 命令是:CREATE TABLE IF NOT EXISTS "visitor" ("id" SERIAL, "email" varchar(255)...

于 2017-10-31T14:22:53.060 回答
1

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

于 2020-06-30T17:54:02.930 回答
0

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

如果您仍然遇到问题,值得检查。表需要删除和重建才能正常工作。

于 2021-06-22T08:53:26.133 回答