diff --git a/Makefile b/Makefile index d6efb00..c0fbf7c 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ test_mysql: $(py_warn) TEST_DB="mysql://root:$(MYSQL_PASS)@$(MYSQL_HOST):$(MYSQL_PORT)/test_\{\}" pytest -vv -s test_postgres: - $(py_warn) TEST_DB="postgres://postgres:$(POSTGRES_PASS)@$(POSTGRES_HOST):$(POSTGRES_PORT)/test_\{\}" pytest + $(py_warn) TEST_DB="postgres://postgres:$(POSTGRES_PASS)@$(POSTGRES_HOST):$(POSTGRES_PORT)/test_\{\}" pytest -vv -s testall: deps test_sqlite test_postgres test_mysql diff --git a/aerich/ddl/__init__.py b/aerich/ddl/__init__.py index 6826e83..192bb3e 100644 --- a/aerich/ddl/__init__.py +++ b/aerich/ddl/__init__.py @@ -17,7 +17,7 @@ class BaseDDL: 'ALTER TABLE "{table_name}" RENAME COLUMN "{old_column_name}" TO "{new_column_name}"' ) _ADD_INDEX_TEMPLATE = ( - 'ALTER TABLE "{table_name}" ADD {unique} INDEX "{index_name}" ({column_names})' + 'ALTER TABLE "{table_name}" ADD {unique}INDEX "{index_name}" ({column_names})' ) _DROP_INDEX_TEMPLATE = 'ALTER TABLE "{table_name}" DROP INDEX "{index_name}"' _ADD_FK_TEMPLATE = 'ALTER TABLE "{table_name}" ADD CONSTRAINT "{fk_name}" FOREIGN KEY ("{db_column}") REFERENCES "{table}" ("{field}") ON DELETE {on_delete}' @@ -163,7 +163,7 @@ class BaseDDL: def add_index(self, model: "Type[Model]", field_names: List[str], unique=False): return self._ADD_INDEX_TEMPLATE.format( - unique="UNIQUE" if unique else "", + unique="UNIQUE " if unique else "", index_name=self.schema_generator._generate_index_name( "idx" if not unique else "uid", model, field_names ), diff --git a/aerich/ddl/mysql/__init__.py b/aerich/ddl/mysql/__init__.py index 438d0fd..daa50d8 100644 --- a/aerich/ddl/mysql/__init__.py +++ b/aerich/ddl/mysql/__init__.py @@ -21,7 +21,7 @@ class MysqlDDL(BaseDDL): "ALTER TABLE `{table_name}` RENAME COLUMN `{old_column_name}` TO `{new_column_name}`" ) _ADD_INDEX_TEMPLATE = ( - "ALTER TABLE `{table_name}` ADD {unique} INDEX `{index_name}` ({column_names})" + "ALTER TABLE `{table_name}` ADD {unique}INDEX `{index_name}` ({column_names})" ) _DROP_INDEX_TEMPLATE = "ALTER TABLE `{table_name}` DROP INDEX `{index_name}`" _ADD_FK_TEMPLATE = "ALTER TABLE `{table_name}` ADD CONSTRAINT `{fk_name}` FOREIGN KEY (`{db_column}`) REFERENCES `{table}` (`{field}`) ON DELETE {on_delete}" diff --git a/aerich/ddl/postgres/__init__.py b/aerich/ddl/postgres/__init__.py index 3ebf617..23123c5 100644 --- a/aerich/ddl/postgres/__init__.py +++ b/aerich/ddl/postgres/__init__.py @@ -2,7 +2,6 @@ from typing import List, Type from tortoise import Model from tortoise.backends.asyncpg.schema_generator import AsyncpgSchemaGenerator -from tortoise.fields import Field from aerich.ddl import BaseDDL @@ -10,10 +9,7 @@ from aerich.ddl import BaseDDL class PostgresDDL(BaseDDL): schema_generator_cls = AsyncpgSchemaGenerator DIALECT = AsyncpgSchemaGenerator.DIALECT - _ADD_INDEX_TEMPLATE = 'CREATE INDEX "{index_name}" ON "{table_name}" ({column_names})' - _ADD_UNIQUE_TEMPLATE = ( - 'ALTER TABLE "{table_name}" ADD CONSTRAINT "{index_name}" UNIQUE ({column_names})' - ) + _ADD_INDEX_TEMPLATE = 'CREATE {unique}INDEX "{index_name}" ON "{table_name}" ({column_names})' _DROP_INDEX_TEMPLATE = 'DROP INDEX "{index_name}"' _DROP_UNIQUE_TEMPLATE = 'ALTER TABLE "{table_name}" DROP CONSTRAINT "{index_name}"' _ALTER_NULL_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" {set_drop} NOT NULL' @@ -38,16 +34,6 @@ class PostgresDDL(BaseDDL): datatype=db_field_types.get(self.DIALECT) or db_field_types.get(""), ) - def add_index(self, model: "Type[Model]", field_names: List[str], unique=False): - template = self._ADD_UNIQUE_TEMPLATE if unique else self._ADD_INDEX_TEMPLATE - return template.format( - index_name=self.schema_generator._generate_index_name( - "uid" if unique else "idx", model, field_names - ), - table_name=model._meta.db_table, - column_names=", ".join([self.schema_generator.quote(f) for f in field_names]), - ) - def drop_index(self, model: "Type[Model]", field_names: List[str], unique=False): template = self._DROP_UNIQUE_TEMPLATE if unique else self._DROP_INDEX_TEMPLATE return template.format( @@ -57,10 +43,12 @@ class PostgresDDL(BaseDDL): table_name=model._meta.db_table, ) - def set_comment(self, model: "Type[Model]", field_object: Field): + def set_comment(self, model: "Type[Model]", field_describe: dict): db_table = model._meta.db_table return self._SET_COMMENT_TEMPLATE.format( table_name=db_table, - column=field_object.model_field_name, - comment="'{}'".format(field_object.description) if field_object.description else "NULL", + column=field_describe.get("db_column") or field_describe.get("raw_field"), + comment="'{}'".format(field_describe.get("description")) + if field_describe.get("description") + else "NULL", ) diff --git a/tests/test_ddl.py b/tests/test_ddl.py index 2a9091e..76855cf 100644 --- a/tests/test_ddl.py +++ b/tests/test_ddl.py @@ -123,7 +123,9 @@ def test_alter_column_default(): def test_alter_column_null(): if isinstance(Migrate.ddl, (SqliteDDL, MysqlDDL)): return - ret = Migrate.ddl.alter_column_null(Category, Category._meta.fields_map.get("name")) + ret = Migrate.ddl.alter_column_null( + Category, Category._meta.fields_map.get("name").describe(False) + ) if isinstance(Migrate.ddl, PostgresDDL): assert ret == 'ALTER TABLE "category" ALTER COLUMN "name" SET NOT NULL' @@ -131,15 +133,11 @@ def test_alter_column_null(): def test_set_comment(): if isinstance(Migrate.ddl, (SqliteDDL, MysqlDDL)): return - ret = Migrate.ddl.set_comment(Category, Category._meta.fields_map.get("name")) - if isinstance(Migrate.ddl, PostgresDDL): - assert ret == 'COMMENT ON COLUMN "category"."name" IS NULL' + ret = Migrate.ddl.set_comment(Category, Category._meta.fields_map.get("name").describe(False)) + assert ret == 'COMMENT ON COLUMN "category"."name" IS NULL' - ret = Migrate.ddl.set_comment(Category, Category._meta.fields_map.get("user")) - if isinstance(Migrate.ddl, PostgresDDL): - assert ret == 'COMMENT ON COLUMN "category"."user" IS \'User\'' - else: - assert ret is None + ret = Migrate.ddl.set_comment(Category, Category._meta.fields_map.get("user").describe(False)) + assert ret == 'COMMENT ON COLUMN "category"."user_id" IS \'User\'' def test_drop_column(): @@ -158,18 +156,15 @@ def test_add_index(): index = Migrate.ddl.add_index(Category, ["name"]) index_u = Migrate.ddl.add_index(Category, ["name"], True) if isinstance(Migrate.ddl, MysqlDDL): - assert index == "ALTER TABLE `category` ADD INDEX `idx_category_name_8b0cb9` (`name`)" + assert index == "ALTER TABLE `category` ADD INDEX `idx_category_name_8b0cb9` (`name`)" assert ( index_u == "ALTER TABLE `category` ADD UNIQUE INDEX `uid_category_name_8b0cb9` (`name`)" ) elif isinstance(Migrate.ddl, PostgresDDL): assert index == 'CREATE INDEX "idx_category_name_8b0cb9" ON "category" ("name")' - assert ( - index_u - == 'ALTER TABLE "category" ADD CONSTRAINT "uid_category_name_8b0cb9" UNIQUE ("name")' - ) + assert index_u == 'CREATE UNIQUE INDEX "uid_category_name_8b0cb9" ON "category" ("name")' else: - assert index == 'ALTER TABLE "category" ADD INDEX "idx_category_name_8b0cb9" ("name")' + assert index == 'ALTER TABLE "category" ADD INDEX "idx_category_name_8b0cb9" ("name")' assert ( index_u == 'ALTER TABLE "category" ADD UNIQUE INDEX "uid_category_name_8b0cb9" ("name")' ) diff --git a/tests/test_migrate.py b/tests/test_migrate.py index 2a91b01..8d8b6f9 100644 --- a/tests/test_migrate.py +++ b/tests/test_migrate.py @@ -763,7 +763,7 @@ def test_migrate(): "ALTER TABLE `email` ADD `address` VARCHAR(200) NOT NULL", "ALTER TABLE `email` DROP COLUMN `user_id`", "ALTER TABLE `email` DROP FOREIGN KEY `fk_email_user_5b58673d`", - "ALTER TABLE `email` ADD INDEX `idx_email_email_4a1a33` (`email`)", + "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`", @@ -790,34 +790,38 @@ def test_migrate(): ) elif isinstance(Migrate.ddl, PostgresDDL): - assert Migrate.upgrade_operators == [ - '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 "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" CHANGE password password VARCHAR(100)', - 'ALTER TABLE "user" ADD UNIQUE INDEX "uid_user_usernam_9987ab" ("username")', - ] - assert Migrate.downgrade_operators == [ - '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 "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" CHANGE password password VARCHAR(200)', - ] + assert sorted(Migrate.upgrade_operators) == sorted( + [ + '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 "email" DROP CONSTRAINT "fk_email_user_5b58673d"', + 'CREATE INDEX "idx_email_email_4a1a33" ON "email" ("email")', + '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" CHANGE password password VARCHAR(100)', + 'CREATE UNIQUE INDEX "uid_user_usernam_9987ab" ON "user" ("username")', + ] + ) + assert sorted(Migrate.downgrade_operators) == sorted( + [ + '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 "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" DROP CONSTRAINT "uid_product_name_f14935"', + '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"', + 'ALTER TABLE "user" CHANGE password password VARCHAR(200)', + ] + ) elif isinstance(Migrate.ddl, SqliteDDL): assert Migrate.upgrade_operators == [ 'ALTER TABLE "config" ADD "user_id" INT NOT NULL /* User */',