我有以下的alembic迁移:
revision = '535f7a49839'
down_revision = '46c675c68f4'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
Session = sessionmaker()
Base = declarative_base()
metadata = sa.MetaData()
# This table definition works
organisations = sa.Table(
'organisations',
metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('creator_id', sa.Integer),
sa.Column('creator_staff_member_id', sa.Integer),
)
"""
# This doesn't...
class organisations(Base):
__tablename__ = 'organisations'
id = sa.Column(sa.Integer, primary_key=True)
creator_id = sa.Column(sa.Integer)
creator_staff_member_id = sa.Column(sa.Integer)
"""
def upgrade():
bind = op.get_bind()
session = Session(bind=bind)
session._model_changes = {} # if you are using Flask-SQLAlchemy, this works around a bug
print(session.query(organisations).all())
raise Exception("don't succeed")
def downgrade():
pass
现在,当我使用命令式定义的表(未注释掉的表)时,查询session.query(organisations).all()
可以正常工作。但是如果我使用声明版本,据我所知,它应该是等价的,我得到一个错误:
sqlalchemy.exc.AmbiguousForeignKeysError:无法确定加入 关系中父/子表之间的条件 StaffMember.organisation - 有多个外键路径 链接表格。指定'foreign_keys'参数,提供一个 应列为包含外国人的那些列的列表 对父表的键引用。
现在我明白了这个错误的含义:我的实际模型中有organisations
到staff_members
的两个外键。但是为什么蒸馏器会关心这些,以及它们如何知道它们存在?这种迁移如何知道名为StaffMember
的内容存在?据我所知,alembic应该只知道你在迁移中明确告诉它的模型。
答案 0 :(得分:0)
原来问题在于我用Flask-script设置我用来调用alembic。我用来调用alembic的命令是导入代码来初始化我的Flask应用程序,它本身就是我的实际模型。