使用Sequelize修改PostgreSQL数据库中的序列

3
我有一个PostgreSQL数据库,我需要首先用预定的id来填充并使用种子数据,然后当我向数据库创建新条目时,我希望id自动增加。当我使用SQLite数据库时,这很简单。但是,当我尝试在PostgreSQL DB上使用相同的代码时,我发现Sequelize创建的ID从零开始,并忽略了种子创建的索引,导致唯一约束错误。
我想这是因为PostgreSQL使用单独的序列来跟踪增量。我的下一步方法是使用Sequelize的原始查询来更改序列。但是,当我尝试运行更改序列查询时,Sequelize无法找到序列。我运行:
db.query("ALTER SEQUENCE COMPOUND_CPCD_seq RESTART WITH 100;");

但是一个错误被生成并在错误信息中声明 "Unhandled rejection SequelizeDatabaseError: relation "compound_cpcd_seq" does not exist"。这是否是大小写字母的问题,因为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,
 }
})
3个回答

1
首先,您需要检查序列是否在包含表的正确数据库模式中创建。
如果已经正确创建,而问题确实是由于大小写字母引起的,您可以将序列名称用引号''括起来解决这个问题。

1
我很愚蠢,序列需要用双引号括起来,像这样:

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

0

改变序列当前值的一种方法是创建迁移。这样修改只会执行一次。

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(),
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接