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

时间:2017-08-10 12:30:49

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

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

我认为这是因为postgresql使用单独的序列来跟踪增量。我的approch来自这里是使用sequelize的原始查询来改变序列。但是当我尝试运行一个alter sequence查询时,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,
 }
})

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我是傻瓜;序列需要双引号,如:

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

答案 2 :(得分:0)

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