diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b6f1fa..56329e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### 0.7.2 - Support virtual fields. +- Fix modify multiple times. (#279) ### 0.7.1 diff --git a/aerich/ddl/__init__.py b/aerich/ddl/__init__.py index e67a059..e4a2402 100644 --- a/aerich/ddl/__init__.py +++ b/aerich/ddl/__init__.py @@ -40,7 +40,9 @@ class BaseDDL: self.schema_generator = self.schema_generator_cls(client) def create_table(self, model: "Type[Model]"): - return self.schema_generator._get_table_sql(model, True)["table_creation_string"].rstrip(";") + return self.schema_generator._get_table_sql(model, True)["table_creation_string"].rstrip( + ";" + ) def drop_table(self, table_name: str): return self._DROP_TABLE_TEMPLATE.format(table_name=table_name) diff --git a/aerich/migrate.py b/aerich/migrate.py index a596332..d9125b0 100644 --- a/aerich/migrate.py +++ b/aerich/migrate.py @@ -281,17 +281,25 @@ class Migrate: # remove indexes for index in old_indexes.difference(new_indexes): cls._add_operator(cls._drop_index(model, index, False), upgrade, True) - old_data_fields = list(filter(lambda x: x.get('db_field_types') is not None, - old_model_describe.get("data_fields"))) - new_data_fields = list(filter(lambda x: x.get('db_field_types') is not None, - new_model_describe.get("data_fields"))) + old_data_fields = list( + filter( + lambda x: x.get("db_field_types") is not None, + old_model_describe.get("data_fields"), + ) + ) + new_data_fields = list( + filter( + lambda x: x.get("db_field_types") is not None, + new_model_describe.get("data_fields"), + ) + ) old_data_fields_name = list(map(lambda x: x.get("name"), old_data_fields)) new_data_fields_name = list(map(lambda x: x.get("name"), new_data_fields)) # add fields or rename fields for new_data_field_name in set(new_data_fields_name).difference( - set(old_data_fields_name) + set(old_data_fields_name) ): new_data_field = next( filter(lambda x: x.get("name") == new_data_field_name, new_data_fields) @@ -303,22 +311,22 @@ class Migrate: if len(changes) == 2: # rename field if ( - changes[0] - == ( + changes[0] + == ( "change", "name", (old_data_field_name, new_data_field_name), - ) - and changes[1] - == ( + ) + and changes[1] + == ( "change", "db_column", ( - old_data_field.get("db_column"), - new_data_field.get("db_column"), + old_data_field.get("db_column"), + new_data_field.get("db_column"), ), - ) - and old_data_field_name not in new_data_fields_name + ) + and old_data_field_name not in new_data_fields_name ): if upgrade: is_rename = click.prompt( @@ -334,9 +342,9 @@ class Migrate: cls._rename_old.append(old_data_field_name) # only MySQL8+ has rename syntax if ( - cls.dialect == "mysql" - and cls._db_version - and cls._db_version.startswith("5.") + cls.dialect == "mysql" + and cls._db_version + and cls._db_version.startswith("5.") ): cls._add_operator( cls._change_field( @@ -367,11 +375,11 @@ class Migrate: ) # remove fields for old_data_field_name in set(old_data_fields_name).difference( - set(new_data_fields_name) + set(new_data_fields_name) ): # don't remove field if is renamed if (upgrade and old_data_field_name in cls._rename_old) or ( - not upgrade and old_data_field_name in cls._rename_new + not upgrade and old_data_field_name in cls._rename_new ): continue old_data_field = next( @@ -403,7 +411,7 @@ class Migrate: # add fk for new_fk_field_name in set(new_fk_fields_name).difference( - set(old_fk_fields_name) + set(old_fk_fields_name) ): fk_field = next( filter(lambda x: x.get("name") == new_fk_field_name, new_fk_fields) @@ -418,7 +426,7 @@ class Migrate: ) # drop fk for old_fk_field_name in set(old_fk_fields_name).difference( - set(new_fk_fields_name) + set(new_fk_fields_name) ): old_fk_field = next( filter(lambda x: x.get("name") == old_fk_field_name, old_fk_fields) @@ -440,6 +448,7 @@ class Migrate: filter(lambda x: x.get("name") == field_name, new_data_fields) ) changes = diff(old_data_field, new_data_field) + modified = False for change in changes: _, option, old_new = change if option == "indexed": @@ -464,7 +473,7 @@ class Migrate: continue elif option == "default": if not ( - is_default_function(old_new[0]) or is_default_function(old_new[1]) + is_default_function(old_new[0]) or is_default_function(old_new[1]) ): # change column default cls._add_operator( @@ -477,11 +486,14 @@ class Migrate: # change nullable cls._add_operator(cls._alter_null(model, new_data_field), upgrade) else: + if modified: + continue # modify column cls._add_operator( cls._modify_field(model, new_data_field), upgrade, ) + modified = True for old_model in old_models: if old_model not in new_models.keys():