Sqlalchemy 访问alembic迁移中的模型
我正在为flask+sqlalchemy项目使用alembic迁移,在我尝试在alembic中查询模型之前,一切正常Sqlalchemy 访问alembic迁移中的模型,sqlalchemy,flask-sqlalchemy,alembic,Sqlalchemy,Flask Sqlalchemy,Alembic,我正在为flask+sqlalchemy项目使用alembic迁移,在我尝试在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))
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中直接使用模型?我也有同样的问题。使用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()
在alembic迁移中不应使用
模型中的类。如果需要使用模型类,则应在每个迁移文件中重新定义它们,以使迁移自包含。原因是可以在一个命令中部署多个迁移,并且在编写迁移时到实际在生产中执行迁移之前,模型类可能已经根据“稍后”迁移进行了更改
例如,请参见文档中的此示例:
提示:您不需要包含完整的模型类,只需要包含迁移所需的部分
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')})
)