add fk and drop fk
This commit is contained in:
@@ -220,9 +220,9 @@ async def history(ctx: Context):
|
||||
@click.pass_context
|
||||
@coro
|
||||
async def init(
|
||||
ctx: Context,
|
||||
tortoise_orm,
|
||||
location,
|
||||
ctx: Context,
|
||||
tortoise_orm,
|
||||
location,
|
||||
):
|
||||
config_file = ctx.obj["config_file"]
|
||||
name = ctx.obj["name"]
|
||||
|
||||
@@ -61,12 +61,12 @@ class BaseDDL:
|
||||
|
||||
def _get_default(self, model: "Type[Model]", field_describe: dict):
|
||||
db_table = model._meta.db_table
|
||||
default = field_describe.get('default')
|
||||
db_column = field_describe.get('db_column')
|
||||
default = field_describe.get("default")
|
||||
db_column = field_describe.get("db_column")
|
||||
auto_now_add = field_describe.get("auto_now_add", False)
|
||||
auto_now = field_describe.get( "auto_now", False)
|
||||
auto_now = field_describe.get("auto_now", False)
|
||||
if default is not None or auto_now_add:
|
||||
if field_describe.get('field_type')in ['UUIDField', 'TextField', 'JSONField']:
|
||||
if field_describe.get("field_type") in ["UUIDField", "TextField", "JSONField"]:
|
||||
default = ""
|
||||
else:
|
||||
try:
|
||||
@@ -103,13 +103,13 @@ class BaseDDL:
|
||||
if description
|
||||
else "",
|
||||
is_primary_key=is_pk,
|
||||
default=self._get_default(model,field_describe),
|
||||
default=self._get_default(model, field_describe),
|
||||
),
|
||||
)
|
||||
|
||||
def drop_column(self, model: "Type[Model]", field_describe: dict):
|
||||
return self._DROP_COLUMN_TEMPLATE.format(
|
||||
table_name=model._meta.db_table, column_name=field_describe.get('db_column')
|
||||
table_name=model._meta.db_table, column_name=field_describe.get("db_column")
|
||||
)
|
||||
|
||||
def modify_column(self, model: "Type[Model]", field_object: Field):
|
||||
@@ -141,7 +141,7 @@ class BaseDDL:
|
||||
)
|
||||
|
||||
def change_column(
|
||||
self, model: "Type[Model]", old_column_name: str, new_column_name: str, new_column_type: str
|
||||
self, model: "Type[Model]", old_column_name: str, new_column_name: str, new_column_type: str
|
||||
):
|
||||
return self._CHANGE_COLUMN_TEMPLATE.format(
|
||||
table_name=model._meta.db_table,
|
||||
@@ -168,34 +168,35 @@ class BaseDDL:
|
||||
table_name=model._meta.db_table,
|
||||
)
|
||||
|
||||
def add_fk(self, model: "Type[Model]", field_describe: dict, field_describe_target: dict):
|
||||
def add_fk(self, model: "Type[Model]", field_describe: dict, reference_table_describe: dict):
|
||||
db_table = model._meta.db_table
|
||||
|
||||
db_column = field_describe.get("raw_field")
|
||||
reference_id = reference_table_describe.get("pk_field").get("db_column")
|
||||
fk_name = self.schema_generator._generate_fk_name(
|
||||
from_table=db_table,
|
||||
from_field=db_column,
|
||||
to_table=field_describe.get('name'),
|
||||
to_field=db_column,
|
||||
to_table=reference_table_describe.get("table"),
|
||||
to_field=reference_table_describe.get("pk_field").get("db_column"),
|
||||
)
|
||||
return self._ADD_FK_TEMPLATE.format(
|
||||
table_name=db_table,
|
||||
fk_name=fk_name,
|
||||
db_column=db_column,
|
||||
table=field_describe.get('name'),
|
||||
field=db_column,
|
||||
on_delete=field_describe.get('on_delete'),
|
||||
table=field_describe.get("name"),
|
||||
field=reference_id,
|
||||
on_delete=field_describe.get("on_delete"),
|
||||
)
|
||||
|
||||
def drop_fk(self, model: "Type[Model]", field_describe: dict, field_describe_target: dict):
|
||||
def drop_fk(self, model: "Type[Model]", field_describe: dict, reference_table_describe: dict):
|
||||
db_table = model._meta.db_table
|
||||
return self._DROP_FK_TEMPLATE.format(
|
||||
table_name=db_table,
|
||||
fk_name=self.schema_generator._generate_fk_name(
|
||||
from_table=db_table,
|
||||
from_field=field_describe.get('raw_field'),
|
||||
to_table=field_describe.get('name'),
|
||||
to_field=field_describe_target.get('db_column'),
|
||||
from_field=field_describe.get("raw_field"),
|
||||
to_table=reference_table_describe.get("table"),
|
||||
to_field=reference_table_describe.get("pk_field").get("db_column"),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -177,7 +177,86 @@ class Migrate:
|
||||
if new_model_str not in old_models.keys():
|
||||
cls._add_operator(cls.add_model(cls._get_model(new_model_str)), upgrade)
|
||||
else:
|
||||
cls.diff_model(old_models.get(new_model_str), new_model_describe, upgrade)
|
||||
old_model_describe = old_models.get(new_model_str)
|
||||
|
||||
old_unique_together = old_model_describe.get("unique_together")
|
||||
new_unique_together = new_model_describe.get("unique_together")
|
||||
|
||||
old_data_fields = old_model_describe.get("data_fields")
|
||||
new_data_fields = 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))
|
||||
|
||||
model = cls._get_model(new_model_describe.get("name").split(".")[1])
|
||||
# add fields
|
||||
for new_data_field_name in set(new_data_fields_name).difference(
|
||||
set(old_data_fields_name)
|
||||
):
|
||||
cls._add_operator(
|
||||
cls._add_field(
|
||||
model,
|
||||
next(
|
||||
filter(
|
||||
lambda x: x.get("name") == new_data_field_name, new_data_fields
|
||||
)
|
||||
),
|
||||
),
|
||||
upgrade,
|
||||
)
|
||||
# remove fields
|
||||
for old_data_field_name in set(old_data_fields_name).difference(
|
||||
set(new_data_fields_name)
|
||||
):
|
||||
cls._add_operator(
|
||||
cls._remove_field(
|
||||
model,
|
||||
next(
|
||||
filter(
|
||||
lambda x: x.get("name") == old_data_field_name, old_data_fields
|
||||
)
|
||||
),
|
||||
),
|
||||
upgrade,
|
||||
)
|
||||
old_fk_fields = old_model_describe.get("fk_fields")
|
||||
new_fk_fields = new_model_describe.get("fk_fields")
|
||||
|
||||
old_fk_fields_name = list(map(lambda x: x.get("name"), old_fk_fields))
|
||||
new_fk_fields_name = list(map(lambda x: x.get("name"), new_fk_fields))
|
||||
|
||||
# add fk
|
||||
for new_fk_field_name in set(new_fk_fields_name).difference(
|
||||
set(old_fk_fields_name)
|
||||
):
|
||||
fk_field = next(
|
||||
filter(lambda x: x.get("name") == new_fk_field_name, new_fk_fields)
|
||||
)
|
||||
cls._add_operator(
|
||||
cls._add_fk(model, fk_field, old_models.get(fk_field.get("python_type"))),
|
||||
upgrade,
|
||||
)
|
||||
# drop fk
|
||||
for old_fk_field_name in set(old_fk_fields_name).difference(
|
||||
set(new_fk_fields_name)
|
||||
):
|
||||
old_fk_field = next(
|
||||
filter(lambda x: x.get("name") == old_fk_field_name, old_fk_fields)
|
||||
)
|
||||
cls._add_operator(
|
||||
cls._drop_fk(
|
||||
model, old_fk_field, old_models.get(old_fk_field.get("python_type"))
|
||||
),
|
||||
upgrade,
|
||||
)
|
||||
# change fields
|
||||
for field_name in set(new_data_fields_name).intersection(set(old_data_fields_name)):
|
||||
old_data_field = next(
|
||||
filter(lambda x: x.get("name") == field_name, old_data_fields)
|
||||
)
|
||||
new_data_field = next(
|
||||
filter(lambda x: x.get("name") == field_name, new_data_fields)
|
||||
)
|
||||
|
||||
for old_model in old_models:
|
||||
if old_model not in new_models.keys():
|
||||
@@ -195,59 +274,6 @@ class Migrate:
|
||||
def remove_model(cls, model: Type[Model]):
|
||||
return cls.ddl.drop_table(model)
|
||||
|
||||
@classmethod
|
||||
def diff_model(cls, old_model_describe: dict, new_model_describe: dict, upgrade=True):
|
||||
"""
|
||||
diff single model
|
||||
:param old_model_describe:
|
||||
:param new_model_describe:
|
||||
:param upgrade:
|
||||
:return:
|
||||
"""
|
||||
|
||||
old_unique_together = old_model_describe.get('unique_together')
|
||||
new_unique_together = new_model_describe.get('unique_together')
|
||||
|
||||
old_data_fields = old_model_describe.get('data_fields')
|
||||
new_data_fields = 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))
|
||||
|
||||
model = cls._get_model(new_model_describe.get('name').split('.')[1])
|
||||
# add fields
|
||||
for new_data_field_name in set(new_data_fields_name).difference(set(old_data_fields_name)):
|
||||
cls._add_operator(
|
||||
cls._add_field(model, next(filter(lambda x: x.get('name') == new_data_field_name, new_data_fields))),
|
||||
upgrade)
|
||||
# remove fields
|
||||
for old_data_field_name in set(old_data_fields_name).difference(set(new_data_fields_name)):
|
||||
cls._add_operator(
|
||||
cls._remove_field(model, next(filter(lambda x: x.get('name') == old_data_field_name, old_data_fields))),
|
||||
upgrade)
|
||||
|
||||
old_fk_fields = old_model_describe.get('fk_fields')
|
||||
new_fk_fields = new_model_describe.get('fk_fields')
|
||||
|
||||
old_fk_fields_name = list(map(lambda x: x.get('name'), old_fk_fields))
|
||||
new_fk_fields_name = list(map(lambda x: x.get('name'), new_fk_fields))
|
||||
|
||||
# add fk
|
||||
for new_fk_field_name in set(new_fk_fields_name).difference(set(old_fk_fields_name)):
|
||||
fk_field = next(filter(lambda x: x.get('name') == new_fk_field_name, new_fk_fields))
|
||||
cls._add_operator(
|
||||
cls._add_fk(model, fk_field,
|
||||
next(filter(lambda x: x.get('db_column') == fk_field.get('raw_field'), new_data_fields))),
|
||||
upgrade)
|
||||
# drop fk
|
||||
for old_fk_field_name in set(old_fk_fields_name).difference(set(new_fk_fields_name)):
|
||||
old_fk_field = next(filter(lambda x: x.get('name') == old_fk_field_name, old_fk_fields))
|
||||
cls._add_operator(
|
||||
cls._drop_fk(
|
||||
model, old_fk_field,
|
||||
next(filter(lambda x: x.get('db_column') == old_fk_field.get('raw_field'), old_data_fields))),
|
||||
upgrade)
|
||||
|
||||
@classmethod
|
||||
def _resolve_fk_fields_name(cls, model: Type[Model], fields_name: Tuple[str]):
|
||||
ret = []
|
||||
@@ -312,8 +338,8 @@ class Migrate:
|
||||
return cls.ddl.modify_column(model, field)
|
||||
|
||||
@classmethod
|
||||
def _drop_fk(cls, model: Type[Model], field_describe: dict, field_describe_target: dict):
|
||||
return cls.ddl.drop_fk(model, field_describe, field_describe_target)
|
||||
def _drop_fk(cls, model: Type[Model], field_describe: dict, reference_table_describe: dict):
|
||||
return cls.ddl.drop_fk(model, field_describe, reference_table_describe)
|
||||
|
||||
@classmethod
|
||||
def _remove_field(cls, model: Type[Model], field_describe: dict):
|
||||
@@ -333,14 +359,14 @@ class Migrate:
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _add_fk(cls, model: Type[Model], field_describe: dict, field_describe_target: dict):
|
||||
def _add_fk(cls, model: Type[Model], field_describe: dict, reference_table_describe: dict):
|
||||
"""
|
||||
add fk
|
||||
:param model:
|
||||
:param field:
|
||||
:return:
|
||||
"""
|
||||
return cls.ddl.add_fk(model, field_describe, field_describe_target)
|
||||
return cls.ddl.add_fk(model, field_describe, reference_table_describe)
|
||||
|
||||
@classmethod
|
||||
def _merge_operators(cls):
|
||||
|
||||
Reference in New Issue
Block a user