使用 Sequelize 改变 postgreSQL 数据库中的序列

Alter sequence in a postgreSQL DB using Sequelize

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

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

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

但是会生成一个错误,并且在错误消息中指出 "Unhandled rejection SequelizeDatabaseError: relation "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,
 }
})

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

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

我傻了;该序列需要用双引号引起来,例如:

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

更改序列当前值的一种方法是创建 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(),
};