【问题标题】:How does autoIncrement work in NodeJs's Sequelize?自动增量在 Node Js Sequelize 中如何工作?
【发布时间】:2013-03-22 04:52:28
【问题描述】:

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

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    尽量不加id属性,看看Sequelize会不会给你加。

    【讨论】:

    • 很抱歉转移了项目优先级,但我会在这个周末回复你。
    • 这对我来说是正确的,但仍然想知道autoIncrement 的目的是什么,如果你每次都必须输入它。也许我配置错误。
    • 问题是如何给自定义主键名称!
    • 可以在options中做defaultValue: invokeGenerateCustomId()
    • @yacine 我需要指定 id 字段,因为我将使用它作为外键来引用另一个表,所以你能告诉我一个方法吗?
    【解决方案2】:

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

    【讨论】:

    • 根据this reported issue,不应再使用omitNull。在模型定义的相应列中使用autoIncrement: true,并且在执行create() 时根本不提供值。
    • @ThalisK。 : 这对我不起作用。和作者有同样的问题。
    • @mxgrn,感谢它为我工作,如果你不省略空值,postgresql 会将空值放入语句中。 github.com/sequelize/sequelize/issues/925
    • @akohout 你找到解决办法了吗?
    【解决方案3】:

    如果我像这样在模型中手动添加“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)...

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在我的情况下,这是因为我指定了 autoincrement: true 而不是 autoIncrement: true。

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

        【讨论】:

          猜你喜欢
          • 2022-10-09
          • 2021-08-25
          • 1970-01-01
          • 2014-01-27
          • 2022-01-09
          • 2019-09-23
          • 2011-06-01
          • 1970-01-01
          相关资源
          最近更新 更多