예제 #1
0
def test_migrate(mocker: MockerFixture):
    mocker.patch("click.prompt", return_value=True)
    apps = Tortoise.apps
    models = apps.get("models")
    diff_models = apps.get("diff_models")
    Migrate.diff_models(diff_models, models)
    if isinstance(Migrate.ddl, SqliteDDL):
        with pytest.raises(NotSupportError):
            Migrate.diff_models(models, diff_models, False)
    else:
        Migrate.diff_models(models, diff_models, False)
    Migrate._merge_operators()
    if isinstance(Migrate.ddl, MysqlDDL):
        assert Migrate.upgrade_operators == [
            "ALTER TABLE `email` DROP FOREIGN KEY `fk_email_user_5b58673d`",
            "ALTER TABLE `category` ADD `name` VARCHAR(200) NOT NULL",
            "ALTER TABLE `user` ADD UNIQUE INDEX `uid_user_usernam_9987ab` (`username`)",
            "ALTER TABLE `user` RENAME COLUMN `last_login_at` TO `last_login`",
        ]
        assert Migrate.downgrade_operators == [
            "ALTER TABLE `category` DROP COLUMN `name`",
            "ALTER TABLE `user` DROP INDEX `uid_user_usernam_9987ab`",
            "ALTER TABLE `user` RENAME COLUMN `last_login` TO `last_login_at`",
            "ALTER TABLE `email` ADD CONSTRAINT `fk_email_user_5b58673d` FOREIGN KEY "
            "(`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE",
        ]
    elif isinstance(Migrate.ddl, PostgresDDL):
        assert Migrate.upgrade_operators == [
            'ALTER TABLE "email" DROP CONSTRAINT "fk_email_user_5b58673d"',
            'ALTER TABLE "category" ADD "name" VARCHAR(200) NOT NULL',
            'ALTER TABLE "user" ADD CONSTRAINT "uid_user_usernam_9987ab" UNIQUE ("username")',
            'ALTER TABLE "user" RENAME COLUMN "last_login_at" TO "last_login"',
        ]
        assert Migrate.downgrade_operators == [
            'ALTER TABLE "category" DROP COLUMN "name"',
            'ALTER TABLE "user" DROP CONSTRAINT "uid_user_usernam_9987ab"',
            'ALTER TABLE "user" RENAME COLUMN "last_login" TO "last_login_at"',
            'ALTER TABLE "email" ADD CONSTRAINT "fk_email_user_5b58673d" FOREIGN KEY ("user_id") REFERENCES "user" ("id") ON DELETE CASCADE',
        ]
    elif isinstance(Migrate.ddl, SqliteDDL):
        assert Migrate.upgrade_operators == [
            'ALTER TABLE "email" DROP FOREIGN KEY "fk_email_user_5b58673d"',
            'ALTER TABLE "category" ADD "name" VARCHAR(200) NOT NULL',
            'ALTER TABLE "user" ADD UNIQUE INDEX "uid_user_usernam_9987ab" ("username")',
            'ALTER TABLE "user" RENAME COLUMN "last_login_at" TO "last_login"',
        ]
        assert Migrate.downgrade_operators == []
예제 #2
0
def test_migrate(mocker: MockerFixture):
    """
    models.py diff with old_models.py
    - change email pk: id -> email_id
    - add field: Email.address
    - add fk: Config.user
    - drop fk: Email.user
    - drop field: User.avatar
    - add index: Email.email
    - add many to many: Email.users
    - remove unique: User.username
    - change column: length User.password
    - add unique_together: (name,type) of Product
    - alter default: Config.status
    - rename column: Product.image -> Product.pic
    """
    mocker.patch("click.prompt", side_effect=(False, True))

    models_describe = get_models_describe("models")
    Migrate.app = "models"
    if isinstance(Migrate.ddl, SqliteDDL):
        with pytest.raises(NotSupportError):
            Migrate.diff_models(old_models_describe, models_describe)
            Migrate.diff_models(models_describe, old_models_describe, False)
    else:
        Migrate.diff_models(old_models_describe, models_describe)
        Migrate.diff_models(models_describe, old_models_describe, False)
    Migrate._merge_operators()
    if isinstance(Migrate.ddl, MysqlDDL):
        assert sorted(Migrate.upgrade_operators) == sorted(
            [
                "ALTER TABLE `category` MODIFY COLUMN `name` VARCHAR(200)",
                "ALTER TABLE `category` MODIFY COLUMN `slug` VARCHAR(100) NOT NULL",
                "ALTER TABLE `config` ADD `user_id` INT NOT NULL  COMMENT 'User'",
                "ALTER TABLE `config` ADD CONSTRAINT `fk_config_user_17daa970` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE",
                "ALTER TABLE `config` ALTER COLUMN `status` DROP DEFAULT",
                "ALTER TABLE `email` ADD `address` VARCHAR(200) NOT NULL",
                "ALTER TABLE `email` DROP COLUMN `user_id`",
                "ALTER TABLE `product` RENAME COLUMN `image` TO `pic`",
                "ALTER TABLE `email` RENAME COLUMN `id` TO `email_id`",
                "ALTER TABLE `email` DROP FOREIGN KEY `fk_email_user_5b58673d`",
                "ALTER TABLE `email` ADD INDEX `idx_email_email_4a1a33` (`email`)",
                "ALTER TABLE `product` ADD UNIQUE INDEX `uid_product_name_f14935` (`name`, `type`)",
                "ALTER TABLE `product` ALTER COLUMN `view_num` SET DEFAULT 0",
                "ALTER TABLE `user` DROP COLUMN `avatar`",
                "ALTER TABLE `user` MODIFY COLUMN `password` VARCHAR(100) NOT NULL",
                "ALTER TABLE `user` MODIFY COLUMN `username` VARCHAR(20) NOT NULL",
                "CREATE TABLE IF NOT EXISTS `newmodel` (\n    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,\n    `name` VARCHAR(50) NOT NULL\n) CHARACTER SET utf8mb4;",
                "ALTER TABLE `user` ADD UNIQUE INDEX `uid_user_usernam_9987ab` (`username`)",
                "CREATE TABLE `email_user` (`email_id` INT NOT NULL REFERENCES `email` (`email_id`) ON DELETE CASCADE,`user_id` INT NOT NULL REFERENCES `user` (`id`) ON DELETE CASCADE) CHARACTER SET utf8mb4",
            ]
        )

        assert sorted(Migrate.downgrade_operators) == sorted(
            [
                "ALTER TABLE `category` MODIFY COLUMN `name` VARCHAR(200) NOT NULL",
                "ALTER TABLE `category` MODIFY COLUMN `slug` VARCHAR(200) NOT NULL",
                "ALTER TABLE `config` DROP COLUMN `user_id`",
                "ALTER TABLE `config` DROP FOREIGN KEY `fk_config_user_17daa970`",
                "ALTER TABLE `config` ALTER COLUMN `status` SET DEFAULT 1",
                "ALTER TABLE `email` ADD `user_id` INT NOT NULL",
                "ALTER TABLE `email` DROP COLUMN `address`",
                "ALTER TABLE `product` RENAME COLUMN `pic` TO `image`",
                "ALTER TABLE `email` RENAME COLUMN `email_id` TO `id`",
                "ALTER TABLE `email` ADD CONSTRAINT `fk_email_user_5b58673d` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE",
                "ALTER TABLE `email` DROP INDEX `idx_email_email_4a1a33`",
                "ALTER TABLE `product` DROP INDEX `uid_product_name_f14935`",
                "ALTER TABLE `product` ALTER COLUMN `view_num` DROP DEFAULT",
                "ALTER TABLE `user` ADD `avatar` VARCHAR(200) NOT NULL  DEFAULT ''",
                "ALTER TABLE `user` DROP INDEX `idx_user_usernam_9987ab`",
                "ALTER TABLE `user` MODIFY COLUMN `password` VARCHAR(200) NOT NULL",
                "ALTER TABLE `user` MODIFY COLUMN `username` VARCHAR(20) NOT NULL",
                "DROP TABLE IF EXISTS `email_user`",
                "DROP TABLE IF EXISTS `newmodel`",
            ]
        )

    elif isinstance(Migrate.ddl, PostgresDDL):
        assert sorted(Migrate.upgrade_operators) == sorted(
            [
                'ALTER TABLE "category" ALTER COLUMN "name" TYPE VARCHAR(200)',
                'ALTER TABLE "category" ALTER COLUMN "slug" TYPE VARCHAR(100)',
                'ALTER TABLE "config" ADD "user_id" INT NOT NULL',
                'ALTER TABLE "config" ADD CONSTRAINT "fk_config_user_17daa970" FOREIGN KEY ("user_id") REFERENCES "user" ("id") ON DELETE CASCADE',
                'ALTER TABLE "config" ALTER COLUMN "status" DROP DEFAULT',
                'ALTER TABLE "email" ADD "address" VARCHAR(200) NOT NULL',
                'ALTER TABLE "email" DROP COLUMN "user_id"',
                'ALTER TABLE "product" RENAME COLUMN "image" TO "pic"',
                'ALTER TABLE "email" RENAME COLUMN "id" TO "email_id"',
                'ALTER TABLE "email" DROP CONSTRAINT "fk_email_user_5b58673d"',
                'CREATE INDEX "idx_email_email_4a1a33" ON "email" ("email")',
                'ALTER TABLE "user" ALTER COLUMN "username" TYPE VARCHAR(20)',
                'CREATE UNIQUE INDEX "uid_product_name_f14935" ON "product" ("name", "type")',
                'ALTER TABLE "product" ALTER COLUMN "view_num" SET DEFAULT 0',
                'ALTER TABLE "user" DROP COLUMN "avatar"',
                'ALTER TABLE "user" ALTER COLUMN "password" TYPE VARCHAR(100)',
                'CREATE TABLE IF NOT EXISTS "newmodel" (\n    "id" SERIAL NOT NULL PRIMARY KEY,\n    "name" VARCHAR(50) NOT NULL\n);\nCOMMENT ON COLUMN "config"."user_id" IS \'User\';',
                'CREATE UNIQUE INDEX "uid_user_usernam_9987ab" ON "user" ("username")',
                'CREATE TABLE "email_user" ("email_id" INT NOT NULL REFERENCES "email" ("email_id") ON DELETE CASCADE,"user_id" INT NOT NULL REFERENCES "user" ("id") ON DELETE CASCADE)',
            ]
        )
        assert sorted(Migrate.downgrade_operators) == sorted(
            [
                'ALTER TABLE "category" ALTER COLUMN "name" TYPE VARCHAR(200)',
                'ALTER TABLE "category" ALTER COLUMN "slug" TYPE VARCHAR(200)',
                'ALTER TABLE "user" ALTER COLUMN "password" TYPE VARCHAR(200)',
                'ALTER TABLE "user" ALTER COLUMN "username" TYPE VARCHAR(20)',
                'ALTER TABLE "config" DROP COLUMN "user_id"',
                'ALTER TABLE "config" DROP CONSTRAINT "fk_config_user_17daa970"',
                'ALTER TABLE "config" ALTER COLUMN "status" SET DEFAULT 1',
                'ALTER TABLE "email" ADD "user_id" INT NOT NULL',
                'ALTER TABLE "email" DROP COLUMN "address"',
                'ALTER TABLE "product" RENAME COLUMN "pic" TO "image"',
                'ALTER TABLE "email" RENAME COLUMN "email_id" TO "id"',
                'ALTER TABLE "email" ADD CONSTRAINT "fk_email_user_5b58673d" FOREIGN KEY ("user_id") REFERENCES "user" ("id") ON DELETE CASCADE',
                'DROP INDEX "idx_email_email_4a1a33"',
                'ALTER TABLE "product" ALTER COLUMN "view_num" DROP DEFAULT',
                'ALTER TABLE "user" ADD "avatar" VARCHAR(200) NOT NULL  DEFAULT \'\'',
                'DROP INDEX "idx_user_usernam_9987ab"',
                'DROP INDEX "uid_product_name_f14935"',
                'DROP TABLE IF EXISTS "email_user"',
                'DROP TABLE IF EXISTS "newmodel"',
            ]
        )
    elif isinstance(Migrate.ddl, SqliteDDL):
        assert Migrate.upgrade_operators == []

        assert Migrate.downgrade_operators == []