您必须告诉 SQLAlchemy 关系的“远程端”是什么,以区分当前行和要连接的行。相关解释位于文档的这一部分关于关系。
这种关系可能如下所示:
parent = db.relationship('Region', remote_side=id, backref='sub_regions')
这是演示自我引用关系的示例:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative.api import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(engine)
Base = declarative_base(engine)
session = Session()
class Region(Base):
__tablename__ = 'region'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
parent_id = Column(Integer, ForeignKey('region.id'), index=True)
parent = relationship(lambda: Region, remote_side=id, backref='sub_regions')
Base.metadata.create_all()
r1 = Region(name='United States of America')
r2 = Region(name='California', parent=r1)
session.add_all((r1, r2))
session.commit()
ca = session.query(Region).filter_by(name='California').first()
print ca.parent.name
由于 echo 打开,将会有很多行 SQL 输出,并且脚本将在末尾打印“United States of America”。