文章内容
2021/12/15 17:03:33,作 者: 黄兵
Original exception was: Could not determine join condition between parent/child tables on relationship
今天在使用 SQLAlchemy 的时候,内连接出现了如下错误:
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class IPCrawlerOperatingSystem->ip_crawler_operating_systems'. Original exception was: Could not determine join condition between parent/child tables on relationship IPCrawlerOperatingSystem.children - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
具体错误代码如下:
class IPCrawlerOperatingSystem(db.Model):
__bind_key__ = 'ip_crawler_db'
__tablename__ = 'ip_crawler_operating_systems'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
icon = db.Column(db.String(128))
link_text = db.Column(db.String(32))
family = db.Column(db.String(64))
screenshots = db.Column(db.String(128), doc='屏幕截图图片地址')
screenshots_describe = db.Column(db.String(64), doc='图片描述')
screenshots_thumbnail = db.Column(db.String(128), doc='屏幕截图略缩图图片地址')
pic_width = db.Column(db.SmallInteger, doc='缩略图长宽比')
pic_height = db.Column(db.SmallInteger, doc='缩略图长宽比')
company_id = db.Column(db.Integer, db.ForeignKey('ip_crawler_companies.id'))
description = db.Column(db.String(1024))
body_html = db.Column(db.String(1024))
# 自引用
preceded_by_id = db.Column(db.Integer, db.ForeignKey('ip_crawler_operating_systems.id'), doc='上一版本')
category_id = db.Column(db.SmallInteger, db.ForeignKey('ip_crawler_ua_categories.id'))
homepage = db.Column(db.String(128))
succeed_by_id = db.Column(db.Integer, db.ForeignKey('ip_crawler_operating_systems.id'), doc='下一版本')
user_agent_process = db.relationship('IPCrawlerProcessUserAgent', backref='ip_crawler_operating_systems',
lazy='dynamic')
children = db.relationship('IPCrawlerOperatingSystem')
出现问题的原因:
原始异常是:无法确定关系 IPCrawlerOperatingSystem.children 上父/子表之间的连接条件 - 有多个外键路径链接表。 指定“foreign_keys”参数,提供应被视为包含对父表的外键引用的列的列表。
说人话:有多个外链,但是 children 无法确定父子关系。
解决方案:
修改代码如下:
children = db.relationship('IPCrawlerOperatingSystem', foreign_keys=[preceded_by_id])
parent = db.relationship('IPCrawlerOperatingSystem', foreign_keys=[succeed_by_id])
省略了上面部分代码,指定对应的外键,这样问题就解决了。
参考资料:
黄兵个人博客原创。
评论列表