Fix default function when migrate

This commit is contained in:
long2ice 2021-04-04 05:46:34 +00:00
parent 793cf2532c
commit b147859960
5 changed files with 29 additions and 5 deletions

1
.gitignore vendored
View File

@ -146,3 +146,4 @@ aerich.ini
src src
.vscode .vscode
.DS_Store .DS_Store
.python-version

View File

@ -4,6 +4,8 @@ from typing import List, Type
from tortoise import BaseDBAsyncClient, Model from tortoise import BaseDBAsyncClient, Model
from tortoise.backends.base.schema_generator import BaseSchemaGenerator from tortoise.backends.base.schema_generator import BaseSchemaGenerator
from aerich.utils import is_default_function
class BaseDDL: class BaseDDL:
schema_generator_cls: Type[BaseSchemaGenerator] = BaseSchemaGenerator schema_generator_cls: Type[BaseSchemaGenerator] = BaseSchemaGenerator
@ -76,7 +78,7 @@ class BaseDDL:
auto_now_add = field_describe.get("auto_now_add", False) 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 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"] or is_default_function(default):
default = "" default = ""
else: else:
try: try:

View File

@ -1,4 +1,5 @@
import os import os
import re
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Dict, List, Optional, Tuple, Type from typing import Dict, List, Optional, Tuple, Type
@ -10,7 +11,12 @@ from tortoise.exceptions import OperationalError
from aerich.ddl import BaseDDL from aerich.ddl import BaseDDL
from aerich.models import MAX_VERSION_LENGTH, Aerich from aerich.models import MAX_VERSION_LENGTH, Aerich
from aerich.utils import get_app_connection, get_models_describe, write_version_file from aerich.utils import (
get_app_connection,
get_models_describe,
is_default_function,
write_version_file,
)
class Migrate: class Migrate:
@ -394,8 +400,13 @@ class Migrate:
# continue since repeated with others # continue since repeated with others
continue continue
elif option == "default": elif option == "default":
# change column default if not (
cls._add_operator(cls._alter_default(model, new_data_field), upgrade) is_default_function(old_new[0]) or is_default_function(old_new[1])
):
# change column default
cls._add_operator(
cls._alter_default(model, new_data_field), upgrade
)
elif option == "unique": elif option == "unique":
# because indexed include it # because indexed include it
pass pass

View File

@ -1,4 +1,5 @@
import importlib import importlib
import re
from typing import Dict from typing import Dict
from click import BadOptionUsage, Context from click import BadOptionUsage, Context
@ -121,3 +122,7 @@ def get_models_describe(app: str) -> Dict:
describe = model.describe() describe = model.describe()
ret[describe.get("name")] = describe ret[describe.get("name")] = describe
return ret return ret
def is_default_function(string: str):
return re.match(r"^<function.+>$", str(string or ""))

View File

@ -1,4 +1,5 @@
import datetime import datetime
import uuid
from enum import IntEnum from enum import IntEnum
from tortoise import Model, fields from tortoise import Model, fields
@ -38,9 +39,13 @@ class Email(Model):
users = fields.ManyToManyField("models.User") users = fields.ManyToManyField("models.User")
def default_name():
return uuid.uuid4()
class Category(Model): class Category(Model):
slug = fields.CharField(max_length=100) slug = fields.CharField(max_length=100)
name = fields.CharField(max_length=200, null=True) name = fields.CharField(max_length=200, null=True, default=default_name)
user = fields.ForeignKeyField("models.User", description="User") user = fields.ForeignKeyField("models.User", description="User")
created_at = fields.DatetimeField(auto_now_add=True) created_at = fields.DatetimeField(auto_now_add=True)