【问题标题】:Alter sequence in a postgreSQL DB using Sequelize使用 Sequelize 更改 postgreSQL DB 中的序列
【发布时间】:2018-01-18 17:00:24
【问题描述】:

我有一个 postgresql 数据库,我需要先播种并使用预先确定的 id,然后当我向数据库创建新项目时,我希望 id 自动递增。当我使用 SQLite 数据库时,这很简单。当我使用 PostgreSQL DB 尝试相同的代码时,我发现 sequelize 创建的 ID 从零开始,并且 忽略了种子创建的索引,导致唯一约束错误。

我认为这是因为 postgresql 使用单独的序列来跟踪增量。我从这里开始的方法是使用来自 sequelize 的原始查询来更改序列。但是当我尝试运行改变序列查询时,sequelize 找不到序列。我跑:

db.query("ALTER SEQUENCE COMPOUND_CPCD_seq RESTART WITH 100;");

但是会生成一个错误,并在错误消息中指出“未处理的拒绝 SequelizeDatabaseError:关系“compound_cpcd_seq”不存在”。这是大写和小写字母的问题,因为 COMPOUND_CPCD_seq 不等于 Compound_cpcd.seq?如果是这种情况,你如何解决这个问题(因为我无法控制 COMPOUND_CPCD_seq 的创建方式)?

我错过了什么?

型号:

const COMPOUND= db.define('COMPOUND', {
  CPCD: {
  type: Sequelize.INTEGER,
  primaryKey: true,
  autoIncrement: true,
  unique: true,
 },
  Name: {
  type: Sequelize.STRING,
 }
})

【问题讨论】:

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


    【解决方案1】:

    更改序列电流值的一种方法是创建migration。这样修改只执行一次。

    const tableName = 'YourTable';
    const sequenceColumn = 'id';
    
    module.exports = {
        up: (queryInterface) => queryInterface.sequelize.transaction(async (transaction) => {
            // Get current highest value from the table
            const [[{ max }]] = await queryInterface.sequelize.query(`SELECT MAX("${sequenceColumn}") AS max FROM public."${tableName}";`, { transaction });
            // Set the autoincrement current value to highest value + 1
            await queryInterface.sequelize.query(`ALTER SEQUENCE public."${tableName}_${sequenceColumn}_seq" RESTART WITH ${max + 1};`, { transaction });
        }),
        down: () => Promise.resolve(),
    };
    

    【讨论】:

      【解决方案2】:

      我很愚蠢;序列需要双引号,如:

      db.query("ALTER SEQUENCE "COMPOUND_CPCD_seq" RESTART WITH 100;");
      

      【讨论】:

        【解决方案3】:

        首先,您必须检查是否在您的表所在的数据库的正确模式中创建了序列。

        如果它创建正确,并且问题确实是由大小写字母引起的,您可以将序列名称放在引号'' 中以解决此问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-03
          • 2012-01-21
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多