从 MySQL 迁移到 Postgres 后在自动增量字段上续集 "null value in column of relation violates not-null constraint"
Sequelize "null value in column of relation violates not-null constraint" on auto increment field after migrate from MySQL to Postgres
我正在尝试从 MySQL 迁移到 Postgres,我使用 pgLoader 移动我的数据,读取操作似乎工作正常但我遇到了这个问题 - 当我尝试使用创建新记录时model.create() 我得到 SequelizeDatabaseError: null value in column of relation violates not-null constraint
我的续集是这样的:
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASS,
{
dialect: 'postgres',
host: process.env.DB_HOST,
port: process.env.DB_PORT,
schema: process.env.DB_PORT.DB_SCHEMA,
logging: false,
dialectOptions: {
...(process.env.DB_PORT === "5432" ? {} : addSSL())
}
}
);
const exampleModel = sequelize.define(
"exampleModel",
{
ExampleID: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
Name: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
},
);
但是当我这样做时:
await model.create({
Name: "FooBaz",
});
我遇到了那个错误。
它在 MySQL 上运行良好,但现在我遇到了这个问题。
我不确定在这种情况下我应该怎么做,因为它明确表示它为 null 重置计数器不会生效。
编辑:
运行 sequelize.sync({alter: true})
打印以下内容
CREATE TABLE IF NOT EXISTS "schema"."exampleModel" ("ExampleID" SERIAL , "Name" VARCHAR(255) NOT NULL UNIQUE, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("ExampleID"));
后跟一些 alter tables 行。
但是当我检查 ExampleID 类型时它仍然是整数(因为它在 MySQL 上),alter 不会改变它。
那我需要手动转串口吗?
已解决!
问题是 pgLoader 没有正确复制自动增量,要修复它,您需要使用序列在 postgres 上手动设置它,请查看此处的说明。
Changing primary key int type to serial
修复后,问题解决。
谢谢@a_horse_with_no_name
我正在尝试从 MySQL 迁移到 Postgres,我使用 pgLoader 移动我的数据,读取操作似乎工作正常但我遇到了这个问题 - 当我尝试使用创建新记录时model.create() 我得到 SequelizeDatabaseError: null value in column of relation violates not-null constraint
我的续集是这样的:
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASS,
{
dialect: 'postgres',
host: process.env.DB_HOST,
port: process.env.DB_PORT,
schema: process.env.DB_PORT.DB_SCHEMA,
logging: false,
dialectOptions: {
...(process.env.DB_PORT === "5432" ? {} : addSSL())
}
}
);
const exampleModel = sequelize.define(
"exampleModel",
{
ExampleID: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
Name: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
},
);
但是当我这样做时:
await model.create({
Name: "FooBaz",
});
我遇到了那个错误。 它在 MySQL 上运行良好,但现在我遇到了这个问题。
我不确定在这种情况下我应该怎么做,因为它明确表示它为 null 重置计数器不会生效。
编辑:
运行 sequelize.sync({alter: true})
打印以下内容
CREATE TABLE IF NOT EXISTS "schema"."exampleModel" ("ExampleID" SERIAL , "Name" VARCHAR(255) NOT NULL UNIQUE, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("ExampleID"));
后跟一些 alter tables 行。 但是当我检查 ExampleID 类型时它仍然是整数(因为它在 MySQL 上),alter 不会改变它。 那我需要手动转串口吗?
已解决!
问题是 pgLoader 没有正确复制自动增量,要修复它,您需要使用序列在 postgres 上手动设置它,请查看此处的说明。 Changing primary key int type to serial
修复后,问题解决。
谢谢@a_horse_with_no_name