为什么 Sequelize 迁移不能与 public 以外的模式一起正常工作?
Why don't the Sequelize migrations work properly with schemas other than public?
我正在使用 Sequelize CLI 执行迁移,它似乎不能很好地处理“public”之外的模式。我 运行 进行了一系列测试,看起来即使我在 Sequelize 命令的“选项”中提供了架构,它也只适用于某些而不适用于其他。
例如,我可以在“向上”部分创建一个 table,它以正确的模式结束,但在“向下”部分失败,因为它找不到 table 在 public:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable("migration_test", {
name: Sequelize.DataTypes.STRING,
isBetaMember: {
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false
}
}, {
schema: "profile"
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable("migration_test", {
schema: "profile"
});
}
};
正确创建table:
Executing (default): CREATE TABLE IF NOT EXISTS
"profile"."migration_test" ("name" VARCHAR(255), "isBetaMember"
BOOLEAN NOT NULL DEFAULT false);
但是,在“向下”时:
Executing (default): DROP TABLE IF EXISTS "migration_test";
table显然没有被删除,所以用处不大。 SequelizeMeta table 以“public”模式结束,如果必须的话,我可以接受。
我也尝试了 addColumn,但甚至无法识别“schema”属性:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
"migration_test",
"test_column_1",
Sequelize.STRING(100), {
schema: "profile"
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn("migration_test", "test_column_1", {
schema: "profile"
});
}
};
...引发错误:
Executing (default): ALTER TABLE "public"."migration_test" ADD COLUMN
"test_column_1" VARCHAR(100);
ERROR: relation "public.migration_test" does not exist
是我做错了什么,还是这只是事物的状态?这不是为了处理 pg 模式而构建的,这似乎不可思议?与使用此框架相比,我是使用 db-migrate 之类的东西还是只为数据库更改编写一次性 SQL 脚本更好?
如果模式不是 public
:
,最好明确指出模式
const table = { schema: SchemaName, tableName: TableName };
module.exports = {
up: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
await queryInterface.createTable(table, attributes, { transaction });
}
),
down: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
await queryInterface.dropTable(table as any, { transaction });
}
)
我正在使用 Sequelize CLI 执行迁移,它似乎不能很好地处理“public”之外的模式。我 运行 进行了一系列测试,看起来即使我在 Sequelize 命令的“选项”中提供了架构,它也只适用于某些而不适用于其他。
例如,我可以在“向上”部分创建一个 table,它以正确的模式结束,但在“向下”部分失败,因为它找不到 table 在 public:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable("migration_test", {
name: Sequelize.DataTypes.STRING,
isBetaMember: {
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false
}
}, {
schema: "profile"
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable("migration_test", {
schema: "profile"
});
}
};
正确创建table:
Executing (default): CREATE TABLE IF NOT EXISTS "profile"."migration_test" ("name" VARCHAR(255), "isBetaMember" BOOLEAN NOT NULL DEFAULT false);
但是,在“向下”时:
Executing (default): DROP TABLE IF EXISTS "migration_test";
table显然没有被删除,所以用处不大。 SequelizeMeta table 以“public”模式结束,如果必须的话,我可以接受。
我也尝试了 addColumn,但甚至无法识别“schema”属性:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
"migration_test",
"test_column_1",
Sequelize.STRING(100), {
schema: "profile"
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn("migration_test", "test_column_1", {
schema: "profile"
});
}
};
...引发错误:
Executing (default): ALTER TABLE "public"."migration_test" ADD COLUMN "test_column_1" VARCHAR(100);
ERROR: relation "public.migration_test" does not exist
是我做错了什么,还是这只是事物的状态?这不是为了处理 pg 模式而构建的,这似乎不可思议?与使用此框架相比,我是使用 db-migrate 之类的东西还是只为数据库更改编写一次性 SQL 脚本更好?
如果模式不是 public
:
const table = { schema: SchemaName, tableName: TableName };
module.exports = {
up: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
await queryInterface.createTable(table, attributes, { transaction });
}
),
down: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
await queryInterface.dropTable(table as any, { transaction });
}
)