映射器无法在辅助表上找到外键(多对多关系)

时间:2019-05-29 21:07:55

标签: flask flask-sqlalchemy

我试图使用flask-SQLAlchemy描述一个简单的“多对多”关系,但是,即使正确定义了映射器,映射器似乎也找不到辅助表上的外键。

我正在使用最新版本的OS flask-SQLAlchemy(2.4)和SQLite。我已经尝试了许多代码变体,但一无所获。怀疑并不能帮助= /

user_permit = db.table('userpermit',
    db.Column('permit_id', db.Integer, db.ForeignKey('permit.permit_id'), primary_key=True),
    db.Column('user_mail', db.String(128), db.ForeignKey('user.user_mail'), primary_key=True)
)

class User(db.Model):
    user_mail = db.Column(db.String(128), primary_key=True)

[...]
    permits = db.relationship('Permit', secondary=user_permit, backref='users_permitted')

class Permit(db.Model):
    permit_id = db.Column(db.Integer, primary_key=True)

我总是收到相同的错误消息:NoForeignKeysError:无法确定关系User.permits的父/子表之间的联接条件-没有通过外部表''链接这些表的外键。确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”和“ secondaryjoin”表达式。

似乎无法识别我的辅助表,因为它说的是“”,而不是“ userpermit”。

2 个答案:

答案 0 :(得分:0)

可能是因为您在定义db.table,而不是db.Table。否则,需要检查其他几件事:

  • 由于您没有为每个表指定__tablename__ =,因此请检查表名是否符合您的期望,例如permituser
  • 您可以使用relationship()的{​​{3}}参数来手动指定连接条件,该参数允许您提供SQL来确定连接

答案 1 :(得分:0)

对不起,你们。看代码行的时间太多。原来我正在实例化db.table('用户许可'.....而不是db.Table(大写T)

谢谢。