SQLAlchemy alembic AmbiguousForeignKeysError用于声明类型,但不适用于等效的非声明类型

时间:2015-07-18 06:31:15

标签: python sqlalchemy alembic

我有以下的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'参数,提供一个   应列为包含外国人的那些列的列表   对父表的键引用。

现在我明白了这个错误的含义:我的实际模型中有organisationsstaff_members的两个外键。但是为什么蒸馏器会关心这些,以及它们如何知道它们存在?这种迁移如何知道名为StaffMember的内容存在?据我所知,alembic应该只知道你在迁移中明确告诉它的模型。

1 个答案:

答案 0 :(得分:0)

原来问题在于我用Flask-script设置我用来调用alembic。我用来调用alembic的命令是导入代码来初始化我的Flask应用程序,它本身就是我的实际模型。