lov*_*esh 5 python sqlalchemy flask flask-sqlalchemy
我有一个模型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)
Run Code Online (Sandbox Code Playgroud)
我试图做的时候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'}
Run Code Online (Sandbox Code Playgroud)
从我的代码,它的工作原理.打败了我.
dav*_*ism 10
您必须告诉SQLAlchemy关系的"远程端"是什么,以区分当前行和要连接的行.相关解释位于关系关系文档的这一部分的中间位置.
这种关系可能如下所示:
parent = db.relationship('Region', remote_side=id, backref='sub_regions')
Run Code Online (Sandbox Code Playgroud)
这是一个展示自我指涉关系的例子:
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
Run Code Online (Sandbox Code Playgroud)
自启用echo以来,将会有许多SQL输出行,脚本将在末尾打印"美国".
小智 7
我对架构名称参数有同样的问题。为了让它工作,我所做的改变是直接在 ForeignKey 和关系中引用表类,而不是使用字符串。例子:
parent_id = Column(Integer, ForeignKey(Region.id), index=True)
parent = relationship(lambda: Region, remote_side=id, backref='sub_regions')
Run Code Online (Sandbox Code Playgroud)
如果您对任何表使用架构,则具有引用这些架构表的外键的其他表必须提供架构的名称。请参阅此处的文档
class Table(db.Model):
__tablename__ = 'table_1_name'
__table_args__ = {'schema': 'my_schema'}
id = Column('id', Integer, primary_key=True)
...
class AnotherTable(db.Model):
__tablename__ = 'table_2_name'
# Doesn't matter if this belongs to the same or different schema
# __table_args__ = {'schema': 'my_schema'}
id = Column('id', Integer, primary_key=True)
t1_id = Column(Integer, ForeignKey('my_schema.table_1_name.id'))
...
Run Code Online (Sandbox Code Playgroud)
适用于 SQLAlchemy 和 Flask-SQLAlchemy。希望这可以帮助。:D