コード例 #1
0
ファイル: cli.py プロジェクト: roadsync/aerich
async def init_db(ctx: Context, safe):
    config = ctx.obj["config"]
    location = ctx.obj["location"]
    app = ctx.obj["app"]

    dirname = Path(location, app)
    try:
        dirname.mkdir(parents=True)
        click.secho(f"Success create app migrate location {dirname}",
                    fg=Color.green)
    except FileExistsError:
        return click.secho(
            f"Inited {app} already, or delete {dirname} and try again.",
            fg=Color.yellow)

    await Tortoise.init(config=config)
    connection = get_app_connection(config, app)
    await generate_schema_for_client(connection, safe)

    schema = get_schema_sql(connection, safe)

    version = await Migrate.generate_version()
    await Aerich.create(
        version=version,
        app=app,
        content=get_models_describe(app),
    )
    content = {
        "upgrade": [schema],
    }
    write_version_file(Path(dirname, version), content)
    click.secho(f'Success generate schema for app "{app}"', fg=Color.green)
コード例 #2
0
ファイル: cli.py プロジェクト: roadsync/aerich
async def upgrade(ctx: Context):
    config = ctx.obj["config"]
    app = ctx.obj["app"]
    migrated = False
    for version_file in Migrate.get_all_version_files():
        try:
            exists = await Aerich.exists(version=version_file, app=app)
        except OperationalError:
            exists = False
        if not exists:
            async with in_transaction(get_app_connection_name(config,
                                                              app)) as conn:
                file_path = Path(Migrate.migrate_location, version_file)
                content = get_version_content_from_file(file_path)
                upgrade_query_list = content.get("upgrade")
                for upgrade_query in upgrade_query_list:
                    await conn.execute_script(upgrade_query)
                await Aerich.create(
                    version=version_file,
                    app=app,
                    content=get_models_describe(app),
                )
            click.secho(f"Success upgrade {version_file}", fg=Color.green)
            migrated = True
    if not migrated:
        click.secho("No upgrade items found", fg=Color.yellow)
コード例 #3
0
    async def migrate(cls, name) -> str:
        """
        diff old models and new models to generate diff content
        :param name:
        :return:
        """
        new_version_content = get_models_describe(cls.app)
        cls.diff_models(cls._last_version_content, new_version_content)
        cls.diff_models(new_version_content, cls._last_version_content, False)

        cls._merge_operators()

        if not cls.upgrade_operators:
            return ""

        return await cls._generate_diff_sql(name)
コード例 #4
0
ファイル: __init__.py プロジェクト: tortoise/aerich
    async def init_db(self, safe: bool):
        location = self.location
        app = self.app
        dirname = Path(location, app)
        dirname.mkdir(parents=True)

        await Tortoise.init(config=self.tortoise_config)
        connection = get_app_connection(self.tortoise_config, app)
        await generate_schema_for_client(connection, safe)

        schema = get_schema_sql(connection, safe)

        version = await Migrate.generate_version()
        await Aerich.create(
            version=version,
            app=app,
            content=get_models_describe(app),
        )
        content = {
            "upgrade": [schema],
        }
        write_version_file(Path(dirname, version), content)
コード例 #5
0
ファイル: __init__.py プロジェクト: tortoise/aerich
 async def upgrade(self):
     migrated = []
     for version_file in Migrate.get_all_version_files():
         try:
             exists = await Aerich.exists(version=version_file,
                                          app=self.app)
         except OperationalError:
             exists = False
         if not exists:
             async with in_transaction(
                     get_app_connection_name(self.tortoise_config,
                                             self.app)) as conn:
                 file_path = Path(Migrate.migrate_location, version_file)
                 content = get_version_content_from_file(file_path)
                 upgrade_query_list = content.get("upgrade")
                 for upgrade_query in upgrade_query_list:
                     await conn.execute_script(upgrade_query)
                 await Aerich.create(
                     version=version_file,
                     app=self.app,
                     content=get_models_describe(self.app),
                 )
             migrated.append(version_file)
     return migrated
コード例 #6
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 == []