簡體   English   中英

為什么 Sequelize 遷移不能與 public 以外的模式一起正常工作?

[英]Why don't the Sequelize migrations work properly with schemas other than public?

我正在使用 Sequelize CLI 執行遷移,它似乎不能很好地處理“公共”之外的模式。 我運行了一系列測試,看起來即使我在 Sequelize 命令的“選項”中提供了架構,它也只適用於某些而不適用於其他。

例如,我可以在“向上”部分創建一個表,它以正確的模式結束,但在“向下”部分失敗,因為它無法在公共場合找到該表:

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"
        });
    }
};

該表已正確創建:

執行(默認):CREATE TABLE IF NOT EXISTS "profile"."migration_test" ("name" VARCHAR(255), "isBetaMember" BOOLEAN NOT NULL DEFAULT false);

但是,在“向下”時:

執行(默認):DROP TABLE IF EXISTS "migration_test";

該表顯然沒有被刪除,所以不是很有用。 SequelizeMeta 表以“公共”模式結束,如果必須的話,我可以接受。

我也嘗試了 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"
        });
    }
};

...拋出錯誤:

執行(默認):ALTER TABLE "public"."migration_test" ADD COLUMN "test_column_1" VARCHAR(100);

錯誤:關系“public.migration_test”不存在

我做錯了什么,還是這只是 state 的事情? 這不是為了處理 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 });
        }
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM