无法在 Flask-sqlalchemy 中创建自引用外键

2023-11-24

我有一个模型Region和每个Region可以有子区域。每个子区域都有一个字段parent_id这是其父区​​域的 id。这是我的模型的样子

class Region(db.Model):
    __tablename__ = 'regions'
    __table_args__ = {'schema': 'schema_name'}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    parent_id = db.Column(db.Integer, db.ForeignKey('regions.id'))
    parent = db.relationship('Region', primaryjoin=('Region.parent_id==Region.id'), backref='sub-regions')
    created_at = db.Column(db.DateTime, default=db.func.now())
    deleted_at = db.Column(db.DateTime)

但是当我尝试做的时候db.create_all我收到这个错误sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'regions.parent_id' could not find table 'regions' with which to generate a foreign key to target column 'id'

为什么找不到regions当我指定它时__tablename__?我正在使用flask-sqlalchemy版本1.0

编辑 - 我删除了这条线

__table_args__ = {'schema': 'schema_name'}

从我的代码来看,它有效。把我打败了。


您必须告诉 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”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Flask-sqlalchemy 中创建自引用外键 的相关文章

随机推荐