[英]SQLAlchemy: Adjacency List with Single Table Inheritance
我正在嘗試設置以下單表 inheritance 鄰接列表結構,其中子 object 包含與父 object 的關系:
class Parent(Base):
__tablename__ = 'testtable'
type = Column(String)
__mapper_args__ = {
'polymorphic_on':type,
'polymorphic_identity':'Parent'
}
id = Column(Integer, primary_key = True)
class Child(Parent):
__mapper_args__ = {
'polymorphic_identity':'Child'
}
parent_id = Column(Integer, ForeignKey('testtable.id'))
parent = relationship('Parent')
但是,當我嘗試創建子類型的 object 並將 / append 設置為父 object 時:
p = Parent()
c = Child()
c.parent.append(p)
db_session.add(c)
db_session.commit()
我收到以下錯誤:
UnmappedColumnError:無法為目標列“testtable.parent_id”執行同步規則; mapper 'mapped class Parent->testtable' 沒有 map 此列。 嘗試使用不包含此列的顯式foreign_keys
集合(或使用 viewonly=True 關系)。
我玩弄了不同的關系定義(backref 等),但在這個階段我很迷茫。 任何想法將不勝感激!
非常感謝提前
為方便起見,這里有一個完整的例子:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
Base = declarative_base()
Session = sessionmaker()
engine = create_engine('sqlite:///test.db')
Session.configure(bind = engine)
db_session = Session()
class Parent(Base):
__tablename__ = 'testtable'
type = Column(String)
__mapper_args__ = {
'polymorphic_on':type,
'polymorphic_identity':'Parent'
}
id = Column(Integer, primary_key = True)
class Child(Parent):
__mapper_args__ = {
'polymorphic_identity':'Child'
}
parent_id = Column(Integer, ForeignKey(Parent.id))
parent = relationship('Parent', remote_side=[parent_id])
Base.metadata.create_all(engine)
p = Parent()
c = Child()
c.parent.append(p)
db_session.add(c)
db_session.commit()
您的Child
object 對Parent
有一個外鍵,因此它是多對一的關系。 因此,您需要使用c.parent = p
而不是c.parent.append(p)
。 您還需要使用remote_side=Parent.id
來建立relationship
。
工作示例:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base, relationship, Session
Base = declarative_base()
engine = create_engine("sqlite://")
class Parent(Base):
__tablename__ = "testtable"
type = Column(String)
__mapper_args__ = {
"polymorphic_on": type,
"polymorphic_identity": "Parent",
}
id = Column(Integer, primary_key=True)
def __repr__(self):
return f"<Parent(id={self.id})>"
class Child(Parent):
__mapper_args__ = {"polymorphic_identity": "Child"}
parent_id = Column(Integer, ForeignKey(Parent.id))
parent = relationship("Parent", remote_side=Parent.id)
def __repr__(self):
return f"<Child(id={self.id}, parent_id={self.parent_id})>"
Base.metadata.create_all(engine)
with Session(engine) as db_session:
p = Parent()
c = Child()
c.parent = p
db_session.add(c)
db_session.commit()
print(c) # <Child(id=2, parent_id=1)>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.