当使用almbic自动生成时,忽略一个模型。

问题描述 投票:1回答:1

我正在尝试使用以下方法为我的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_onlinerun_migrations_offline 我给了 include_object=include_object 而这似乎是工作正常。

理想情况下,我想使用 skip_autogenerate=True但我不确定我是否能定义这一点,所以以后我可以简单地删除在 models.py 当我升级到新版本的数据库时,得到我想要的行为。

我是不是遗漏了什么?

python sqlalchemy alembic
1个回答
0
投票

就我所看到的。skip_autogenerate Alembic和SQLAlchemy都不会自动处理。但你可以把它添加到 Table.info 像这样。

  1. 定义一个混频器,添加 skip_autogenerateTable.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
  1. 使用这个mixin来定义一个元类,并将其传递给 declarative_base()
from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base

class DefaultMeta(ModelInfoMetaMixin, DeclarativeMeta):
    pass

Model = declarative_base(cls=BaseModel, metaclass=DefaultMeta)
  1. 然后你可以用这个标记来定义你的模型。
class OneModel(Model):
    __skip_autogenerate__ = True
    uuid = Column(UUID(as_uuid=True), primary_key=True)
  1. 最后 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
© www.soinside.com 2019 - 2024. All rights reserved.