我有一个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,
}
})
答案 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(),
};