The My Python / SQLAlchemy application manages a collection of nodes, all derived from the Node base class. I am using SQLAlchemy polymorphism functions to manage nodes in a SQLite3 table. Here's the definition of a Node base class:
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}
and, for example, one of the derived classes, 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)
Now I need a new kind of node, ListNode, which is an ordered container with zero or more nodes. When I load a ListNode, I want it to have its identifier and title (from the Node base class) along with a set of its contained (child) nodes. A Node can appear in multiple ListNode lists, so it is not a proper hierarchy. I would create them in the following lines:
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 , "list" "_sa_instance_state". ,
,
SQLAlchemy, , . ,
. !