我正在阅读SQLAlchemy文档,并对给定的示例感到困惑:
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('node.id'))
data = Column(String(50))
children = relationship("Node")
我知道Node对象可以通过此类定义拥有许多子对象。我的理解是在创建和保存Node对象时,会将一条记录(id,parent_id,data)插入到数据库中,我知道默认会生成id
,但parent_id
是如何生成的?我在我的项目中尝试了类似用法,但parent_id
保留None
。
答案 0 :(得分:1)
parent_id
并非真正生成,而是使用对象之间的实际关系进行分配。这就是说sqlalchemy
会parent_id
为Node.children
所有孩子保存正确的{。}}。
例如,为了实现您链接到的sqlalchemy
文档中记录的关系图:
root --+---> child1
+---> child2 --+--> subchild1
| +--> subchild2
+---> child3
您可以通过以下方式编写代码:
root = Node(
data='root',
# @NOTE: all Node under this children will have `parent_id` point to the `id` of this (root) Node
children=[
Node(data='child1'),
Node(data='child2',
children=[
Node(data='subchild1'),
Node(data='subchild2'),
]),
Node(data='child3')
]
)
session.add(root) # this will also add all the other nodes in the graph
session.commit()