Python 使用alembic autogenerate时忽略模型

Python 使用alembic autogenerate时忽略模型,python,sqlalchemy,alembic,Python,Sqlalchemy,Alembic,我正在尝试使用alembic为我的数据库自动生成修订。在这样做时,我想忽略一些模型(它们的数据类型不受当前版本MySQL的支持)。这是我尝试过的,似乎效果不错,但我不确定这是最惯用的方法 内部alembic/env.py def包含对象(对象、类型、名称、反射、比较对象): 如果类型为“table”,名称为“model\u to\u be\u ignored”: 返回错误 返回真值 然后在run_migrations_online和run_migrations_offline中,我给出了inc

我正在尝试使用
alembic
为我的数据库自动生成修订。在这样做时,我想忽略一些模型(它们的数据类型不受当前版本MySQL的支持)。这是我尝试过的,似乎效果不错,但我不确定这是最惯用的方法

内部
alembic/env.py

def包含对象(对象、类型、名称、反射、比较对象):
如果类型为“table”,名称为“model\u to\u be\u ignored”:
返回错误
返回真值
然后在
run_migrations_online
run_migrations_offline
中,我给出了
include_object=include_object
,看起来效果不错

理想情况下,我希望使用
skip_autogenerate=True
,但不确定我是否可以定义它,以便以后我可以在
models.py
中删除该行,并在升级到较新版本的数据库时获得所需的行为


我有什么遗漏吗

据我所知,
skip_autogenerate
不是由Alembic或SQLAlchemy自动处理的。但您可以将其添加到
表.info
中,如下所示:

  • 定义一个mixin,该mixin将
    skip_autogenerate
    添加到
    Table.info
    。这是基于炼金术的
  • 使用此mixin定义一个元类,并将其传递给
    declarative\u base()
  • 然后可以使用此标记定义模型:
  • 最后,
    skip_autogenerate
    将在Alembic的
    include_object
    中提供:
  • 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
    
    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)
    
    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