我正在尝试使用以下方法为我的DB自动生成修订版。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
当我升级到新版本的数据库时,得到我想要的行为。
我是不是遗漏了什么?
就我所看到的。skip_autogenerate
Alembic和SQLAlchemy都不会自动处理。但你可以把它添加到 Table.info
像这样。
skip_autogenerate
到 Table.info
. 这是基于Flask-SQLAlchemy的 BindMetaMixinclass 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