gab*_*jit 5 python sqlalchemy alembic
我正在尝试使用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 Code Online (Sandbox Code Playgroud)
然后在里面run_migrations_online我run_migrations_offline给了include_object=include_object,这似乎工作正常。
理想情况下,我想使用skip_autogenerate=True,但不确定我可以定义它,以便稍后我可以简单地删除 中的该行,models.py并在升级到较新版本的数据库时获得我想要的行为。
我有什么遗漏的吗?
据我所知,skip_autogenerateAlembic 和 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
Run Code Online (Sandbox Code Playgroud)
declarative_base()from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base
class DefaultMeta(ModelInfoMetaMixin, DeclarativeMeta):
pass
Model = declarative_base(cls=BaseModel, metaclass=DefaultMeta)
Run Code Online (Sandbox Code Playgroud)
class OneModel(Model):
__skip_autogenerate__ = True
uuid = Column(UUID(as_uuid=True), primary_key=True)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1887 次 |
| 最近记录: |