autoIncrement如何在NodeJs的Sequelize中工作?

Eri*_* H. 33 auto-increment node.js sequelize.js postgresql-9.1

Sequelize的文件并没有详细说明autoIncrement.它只包括以下示例:

// autoIncrement can be used to create auto_incrementing integer columns
incrementMe: { type: Sequelize.INTEGER, autoIncrement: true }
Run Code Online (Sandbox Code Playgroud)

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

db.define('Entries', {
    id: {
        type: Seq.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    title: {
        type: Seq.STRING,
        allowNull: false
    },
    entry: {
        type: Seq.TEXT,
        allowNull: false
    }
}
Run Code Online (Sandbox Code Playgroud)

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

models.Entry.create({title:'first entry', entry:'yada yada yada'})
Run Code Online (Sandbox Code Playgroud)

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

列"id"中的空值违反非空约束

我会假设Sequelize会将整数放入我的身份或定义数据库表来自行完成.显然不是?我在这里缺少什么来确保id自动递增和填充?

非常感谢.

Yac*_*gui 23

通常Sequelize.js适应数据库.因此autoincrement属性对应于PostgreSQL中的串行类型.

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

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


mxg*_*grn 10

omitNull默认情况下,config选项为false.设置为true,idPostgres将负责:

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'})
Run Code Online (Sandbox Code Playgroud)

  • 根据[本报告的问题](https://github.com/sequelize/sequelize/issues/2813),不应再使用`omitNull`.在模型定义的相应列中使用`autoIncrement:true`,而在执行`create()`时只是不提供值. (6认同)
  • @ThalisK。: 这对我不起作用。遇到和作者一样的问题。 (3认同)

小智 7

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

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

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