我正在尝试使用alembic
为数据库自动生成修订。这样做时,我想忽略某些模型(它们的数据类型不受当前版本的MySQL支持)。这是我尝试过的方法,看起来似乎很好,但是我不确定这是最惯用的方法
在alembic/env.py
内
def include_object(object, type_, name, reflected, compare_to):
if type_ == 'table' and name == 'model_to_be_ignored':
return False
return True
然后在run_migrations_online
和run_migrations_offline
内输入include_object=include_object
,这似乎工作正常。
理想情况下,我想使用skip_autogenerate=True
,但不确定是否可以定义它,以便稍后我可以简单地删除models.py
中的该行,并在升级到较新版本时获得所需的行为数据库版本。
我缺少什么吗?
答案 0 :(得分:1)
据我所知,skip_autogenerate
不会由Alembic或SQLAlchemy自动处理。但是您可以像这样将其添加到Table.info
:
skip_autogenerate
添加到Table.info
的混合。这基于Flask-SQLAlchemy的BindMetaMixin class ModelInfoMetaMixin(object):
def __init__(cls, name, bases, d):
skip_autogenerate = d.pop("__skip_autogenerate__", None)
super(ModelInfoMetaMixin, cls).__init__(name, bases, d)
if skip_autogenerate is not None and getattr(cls, "__table__", None) is not None:
cls.__table__.info["skip_autogenerate"] = skip_autogenerate
declarative_base()
from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base
class DefaultMeta(ModelInfoMetaMixin, DeclarativeMeta):
pass
Model = declarative_base(cls=BaseModel, metaclass=DefaultMeta)
class OneModel(Model):
__skip_autogenerate__ = True
uuid = Column(UUID(as_uuid=True), primary_key=True)
skip_autogenerate
将在Alembic的include_object
中可用:def include_object(object, name, type_, reflected, compare_to):
# skip objects marked with "skip_autogenerate"
if object.info.get("skip_autogenerate", False):
return False
return True