PostgreSQL add/drop index/unique
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
				
			|||||||
from typing import Type
 | 
					from typing import List, Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from tortoise import Model
 | 
					from tortoise import Model
 | 
				
			||||||
from tortoise.backends.asyncpg.schema_generator import AsyncpgSchemaGenerator
 | 
					from tortoise.backends.asyncpg.schema_generator import AsyncpgSchemaGenerator
 | 
				
			||||||
@@ -10,6 +10,12 @@ from aerich.ddl import BaseDDL
 | 
				
			|||||||
class PostgresDDL(BaseDDL):
 | 
					class PostgresDDL(BaseDDL):
 | 
				
			||||||
    schema_generator_cls = AsyncpgSchemaGenerator
 | 
					    schema_generator_cls = AsyncpgSchemaGenerator
 | 
				
			||||||
    DIALECT = AsyncpgSchemaGenerator.DIALECT
 | 
					    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})'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    _DROP_INDEX_TEMPLATE = 'DROP INDEX "{index_name}"'
 | 
				
			||||||
 | 
					    _DROP_UNIQUE_TEMPLATE = 'ALTER TABLE "{table_name}" DROP CONSTRAINT "{index_name}"'
 | 
				
			||||||
    _ALTER_DEFAULT_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" {default}'
 | 
					    _ALTER_DEFAULT_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" {default}'
 | 
				
			||||||
    _ALTER_NULL_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" {set_drop} NOT NULL'
 | 
					    _ALTER_NULL_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" {set_drop} NOT NULL'
 | 
				
			||||||
    _MODIFY_COLUMN_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" TYPE {datatype}'
 | 
					    _MODIFY_COLUMN_TEMPLATE = 'ALTER TABLE "{table_name}" ALTER COLUMN "{column}" TYPE {datatype}'
 | 
				
			||||||
@@ -41,6 +47,25 @@ class PostgresDDL(BaseDDL):
 | 
				
			|||||||
            datatype=field_object.get_for_dialect(self.DIALECT, "SQL_TYPE"),
 | 
					            datatype=field_object.get_for_dialect(self.DIALECT, "SQL_TYPE"),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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(
 | 
				
			||||||
 | 
					            index_name=self.schema_generator._generate_index_name(
 | 
				
			||||||
 | 
					                "uid" if unique else "idx", model, field_names
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            table_name=model._meta.db_table,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def set_comment(self, model: "Type[Model]", field_object: Field):
 | 
					    def set_comment(self, model: "Type[Model]", field_object: Field):
 | 
				
			||||||
        db_table = model._meta.db_table
 | 
					        db_table = model._meta.db_table
 | 
				
			||||||
        return self._SET_COMMENT_TEMPLATE.format(
 | 
					        return self._SET_COMMENT_TEMPLATE.format(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ class Status(IntEnum):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class User(Model):
 | 
					class User(Model):
 | 
				
			||||||
    username = fields.CharField(max_length=20,)
 | 
					    username = fields.CharField(max_length=20)
 | 
				
			||||||
    password = fields.CharField(max_length=200)
 | 
					    password = fields.CharField(max_length=200)
 | 
				
			||||||
    last_login = fields.DatetimeField(description="Last Login", default=datetime.datetime.now)
 | 
					    last_login = fields.DatetimeField(description="Last Login", default=datetime.datetime.now)
 | 
				
			||||||
    is_active = fields.BooleanField(default=True, description="Is Active")
 | 
					    is_active = fields.BooleanField(default=True, description="Is Active")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,6 +146,12 @@ def test_add_index():
 | 
				
			|||||||
        assert (
 | 
					        assert (
 | 
				
			||||||
            index_u == "ALTER TABLE `category` ADD UNIQUE INDEX `uid_category_name_8b0cb9` (`name`)"
 | 
					            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")'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
    else:
 | 
					    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 (
 | 
					        assert (
 | 
				
			||||||
@@ -155,10 +161,16 @@ def test_add_index():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def test_drop_index():
 | 
					def test_drop_index():
 | 
				
			||||||
    ret = Migrate.ddl.drop_index(Category, ["name"])
 | 
					    ret = Migrate.ddl.drop_index(Category, ["name"])
 | 
				
			||||||
 | 
					    ret_u = Migrate.ddl.drop_index(Category, ["name"], True)
 | 
				
			||||||
    if isinstance(Migrate.ddl, MysqlDDL):
 | 
					    if isinstance(Migrate.ddl, MysqlDDL):
 | 
				
			||||||
        assert ret == "ALTER TABLE `category` DROP INDEX `idx_category_name_8b0cb9`"
 | 
					        assert ret == "ALTER TABLE `category` DROP INDEX `idx_category_name_8b0cb9`"
 | 
				
			||||||
 | 
					        assert ret_u == "ALTER TABLE `category` DROP INDEX `uid_category_name_8b0cb9`"
 | 
				
			||||||
 | 
					    elif isinstance(Migrate.ddl, PostgresDDL):
 | 
				
			||||||
 | 
					        assert ret == 'DROP INDEX "idx_category_name_8b0cb9"'
 | 
				
			||||||
 | 
					        assert ret_u == 'ALTER TABLE "category" DROP CONSTRAINT "uid_category_name_8b0cb9"'
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        assert ret == 'ALTER TABLE "category" DROP INDEX "idx_category_name_8b0cb9"'
 | 
					        assert ret == 'ALTER TABLE "category" DROP INDEX "idx_category_name_8b0cb9"'
 | 
				
			||||||
 | 
					        assert ret_u == 'ALTER TABLE "category" DROP INDEX "uid_category_name_8b0cb9"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_add_fk():
 | 
					def test_add_fk():
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user