SQLAlchemy模型类双向关联问题:类定义顺序限制致关联失败
解决SQLAlchemy双向关联类互相引用的问题
你的问题出在ForeignKey直接引用未定义类的属性上:Type.id在Language类定义时还不存在,导致报错;而relationship用字符串类名(比如'Type')是延迟解析的,本身不会有问题。
解决方法很简单:把ForeignKey的类属性引用改成字符串形式的「表名.列名」,具体修正如下:
class Language(Updateable, db.Model): __tablename__ = 'language' id = sqla.Column(sqla.Integer, primary_key=True) language = sqla.Column(sqla.String(2), nullable=False) # 用字符串形式的表列引用代替Type.id type_id = sqla.Column(sqla.Integer, sqla.ForeignKey('type.id'), index=True) type = sqla_orm.relationship('Type', back_populates='translated_languages') # 注意修正UserList为uselist types = sqla_orm.relationship('Type', back_populates='language', uselist=False) class Type(Updateable, db.Model): __tablename__ = 'type' id = sqla.Column(sqla.Integer, primary_key=True) translated_languages = sqla_orm.relationship('Language', back_populates='type') # 同样改成字符串形式的表列引用 language_id = sqla.Column(sqla.Integer, sqla.ForeignKey('language.id'), index=True) language = sqla_orm.relationship('Language', back_populates='types')
原理说明
- SQLAlchemy的
relationship接受字符串类名时,会在所有模型类都加载完成后再解析关联,所以不受定义顺序影响。 - 而
ForeignKey如果直接写Type.id,Python解释器在执行到这行代码时,Type类还没定义,就会抛出未定义错误;换成字符串'type.id'后,SQLAlchemy会通过表名(即__tablename__的值)去查找对应的表和列,避开了类定义顺序的限制。
内容的提问来源于stack exchange,提问作者rockets4all
相关产品推荐
相关产品推荐

