【发布时间】:2010-12-19 23:42:24
【问题描述】:
我的 Python / SQLAlchemy 应用程序管理一组节点,所有节点都派生自一个基类 Node。我正在使用 SQLAlchemy 的多态特性来管理 SQLite3 表中的节点。下面是 Node 基类的定义:
class Node(db.Base):
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
node_type = Column(String(40))
title = Column(UnicodeText)
__mapper_args__ = {'polymorphic_on': node_type}
例如,一个派生类,NoteNode:
class NoteNode(Node):
__mapper_args__ = {'polymorphic_identity': 'note'}
__tablename__ = 'nodes_note'
id = Column(None,ForeignKey('nodes.id'),primary_key=True)
content_type = Column(String)
content = Column(UnicodeText)
现在我需要一种新的节点,ListNode,它是零个或多个 Node 的有序容器。当我加载一个 ListNode 时,我希望它有它的 ID 和标题 (来自基础 Node 类)及其包含的(子)节点的集合。一个Node 可能出现在多个ListNode 中,因此它不是一个适当的层次结构。我会按照这些思路创建它们:
note1 = NoteNode(title=u"Note 1", content_type="text/text", content=u"I am note #1")
session.add(note1)
note2 = NoteNode(title=u"Note 2", content_type="text/text", content=u"I am note #2")
session.add(note2)
list1 = ListNode(title=u"My List")
list1.items = [note1,note2]
session.add(list1)
孩子的名单应该只 由 Node 对象组成——也就是说,我所需要的只是它们的基类内容。他们不应该完全实现到专业课 (因此,除其他原因外,我没有立即获得整个图表)。
我从以下几行开始,将我在各个地方找到的零碎拼凑在一起,但没有完全了解 发生了什么,所以这可能没有多大意义:
class ListNode(Node):
__mapper_args__ = {'polymorphic_identity': 'list', 'inherit_condition':id==Node.id}
__tablename__ = 'nodes_list_contents'
id = Column(None, ForeignKey('nodes.id'), primary_key=True)
item_id = Column(None, ForeignKey('nodes.id'), primary_key=True)
items = relation(Node, primaryjoin="Node.id==ListNode.item_id")
这种方法在几个方面失败了:它似乎不允许空 ListNode,并将 items 属性设置为列表结果 在 SQLAlchemy 中抱怨“列表”对象没有属性“_sa_instance_state”。毫不奇怪,在这个主题上数小时的随机突变并没有给出任何 效果不错,
我在 SQLAlchemy 方面的经验有限,但我真的很想尽快完成这项工作。我非常感谢您提供的任何建议或指导 提供。提前致谢!
【问题讨论】:
标签: python sqlalchemy