访问alembic迁移中的模型

时间:2013-07-09 11:30:15

标签: sqlalchemy flask-sqlalchemy alembic

我正在使用alembic迁移进行烧瓶+ sqlalchemy项目,事情按预期工作,直到我尝试查询alembic中的模型。

from models import StoredFile

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.add_column('stored_file', sa.Column('mimetype', sa.Unicode(length=32))
    for sf in StoredFile.query.all():
        sf.mimetype = guess_type(sf.title)

上面的代码在添加列之后被卡住,永远不会出现。我想StoredFile.query试图使用与alembic使用的数据库连接不同的数据库连接。 (但为什么?我错过了env.py中的内容吗?)

我可以使用op.get_bind().execute(...)来解决它,但问题是如何直接在alembic中使用模型?

2 个答案:

答案 0 :(得分:3)

您不应在简历迁移中使用models中的类。如果需要使用模型类,则应在每个迁移文件中重新定义它们,以使迁移自包含。原因是可以在一个命令中部署多个迁移,并且可能在编写迁移之间直到在生产中实际执行之前,模型类已根据&#34进行了更改。 ;后"迁移。

例如,请参阅Operations.execute的文档中的此示例:

from sqlalchemy.sql import table, column
from sqlalchemy import String
from alembic import op

account = table('account',
    column('name', String)
)
op.execute(
    account.update(). \
        where(account.c.name==op.inline_literal('account 1')). \
        values({'name':op.inline_literal('account 2')})
        )

提示:您不需要包含完整的模型类,只需要包含迁移所需的部分。

答案 1 :(得分:1)

我遇到了同样的问题。当您使用StoredFile.query时,您正在使用alembic正在使用的其他会话。它尝试查询数据库,但表已锁定,因为您正在更改它。所以升级只是坐在那里并且永远等待,因为你有两个会话等待彼此。基于@SowingSadness响应,这对我有用:

from models import StoredFile

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.add_column('stored_file', sa.Column('mimetype', sa.Unicode(length=32))

    connection = op.get_bind()
    SessionMaker = sessionmaker(bind=connection.engine)
    session = SessionMaker(bind=connection)
    for sf in session.query(StoredFile):
        sf.mimetype = guess_type(sf.title)
    session.flush()
    op.other_operations()