Python Alembic忽略特定表
我使用alembic按照用户定义的sqlalchemy模型管理数据库迁移。我的挑战是我希望alembic忽略对特定表集的任何创建、删除或更改。 注意:我的Q与这个问题类似,但不同之处在于我想从模型定义之外控制alembic 下面是一个我想忽略的示例表:Python Alembic忽略特定表,python,sqlalchemy,alembic,Python,Sqlalchemy,Alembic,我使用alembic按照用户定义的sqlalchemy模型管理数据库迁移。我的挑战是我希望alembic忽略对特定表集的任何创建、删除或更改。 注意:我的Q与这个问题类似,但不同之处在于我想从模型定义之外控制alembic 下面是一个我想忽略的示例表: from sqlalchemy import MetaData from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(metadata=Me
from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(metadata=MetaData())
class Ignore1(Base):
"""
Signed in to the account...
"""
__tablename__ = 'ignore_1'
__table_args__ = {
'info':{'skip_autogenerate':True}
}
id = Column(Integer, primary_key=True)
foo = Column(String(20), nullable=True)
示例代码(无法解决我的问题):在
alembic/env.py
#理想情况下,它存储在我的实际数据库中,但现在,让我们假设我们有一个列表。。。
忽略_表=['IGNORE_1','IGNORE_2']
def包括对象(对象、名称、类型、反射、比较对象):
"""
你是否应该包括这张桌子?
"""
如果类型==“table”和(IGNORE\u TABLES或object.info.get(“skip\u autogenerate”,False)中的名称):
返回错误
elif类型==“column”和object.info.get(“skip\u autogenerate”,False):
返回错误
返回真值
#然后添加到配置中
context.configure(
...
包含对象=包含对象,
...
)
我找到了解决问题的方法
我的错误是在env.py
def run_migrations_offline():
...
context.configure(
url=url,
target_metadata=target_metadata,
include_object=include_object,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
context.run_migrations()
我没有将此更改应用于在线迁移的上下文:
def run_migrations_online():
...
可连接=引擎配置中的引擎配置(
config.get_节(config.config_ini_节),
prefix=“sqlalchemy.”,
poolclass=pool.NullPool,
)
使用connectable.connect()作为连接:
context.configure(
连接=连接,
target\u metadata=target\u metadata,
#我的原始代码中缺少以下行
include_object=include_object,#你说的“不能解决我的问题”是什么意思?过滤器如果在IGNORE\u TABLES:
中键入\='table'和名称,则应按预期工作。感谢您深入到这个@van-->中,上面的代码阻止在IGNORE\u TABLES
中创建表,但不会忽略新列的创建。好的,您如何在您的模型上配置skip\u autogenerate
?我正在询问这个问题ion,因为您链接到的另一个SO问题的答案清楚地表明,skip_autogenerate
需要由您来处理。因此,为了理解您为什么要在自己的方面工作,此信息缺失。我明白了。让我将此添加到问题中…@vanI找到了解决方案!@van
def run_migrations_online():
...
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
# THE FOLLOWING LINE WAS MISSING FROM MY ORIGINAL CODE
include_object=include_object, # <----------------------- THIS!
)
...