Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Alembic忽略特定表_Python_Sqlalchemy_Alembic - Fatal编程技术网

Python 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

我使用alembic按照用户定义的sqlalchemy模型管理数据库迁移。我的挑战是我希望alembic忽略对特定表集的任何创建、删除或更改。

注意:我的Q与这个问题类似,但不同之处在于我想从模型定义之外控制alembic

下面是一个我想忽略的示例表:

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!
        )
    ...