hello everyone!
I was wondering which is the best way to model a tree-looking
structure with SqlAlchemy.
Right now, I have this two classes:
----------------------------------------
#!/usr/bin/python2.6
class MyNode(object):
def __init__(self):
self.items = list()
def addItem(self, item):
if isinstance(item, MyNode) or isinstance(item, MyLeaf):
self.items.append(item)
def __str__(self):
retval = str()
for item in self.items:
if isinstance(item, MyNode):
retval = retval + "\n< Node: " + str(item) + "
>\n"
else:
retval = "\nLeaf: " + str(item) + retval
return retval
class MyLeaf(object):
def __init__(self):
self.content = "I'm a leaf"
def __str__(self):
return self.content
----------------------------------------
As you can see, a node can contain (in its ".items" list) other nodes,
other leafs and a mix of nodes and leafs.
When I model that using SqlAlchemy, both MyNode and MyLeaf will be
stored their own tables and will have a unique id field in the
database.
I was wondering if the best thing to do is using two relationships in
the MyNode class or trying to do it with one (closer to how it is
now).
If I use two relationships, the first one (which I could call
".otherNodes", for instance) could give me the other instances of
MyNode and the second one (".leaves", for instance) would give
instances of MyLeaf.
And well... I really don't know if it's doable putting both of them
together in a unique relationship.
I know I'm going to need intermediate tables to model this structure,
but I don't know if it's doable (or good idea) to make only one table
that may look like:
nodes_towards_content = Table(
"nodes_towards_content",
metadata,
Column("node_id", Integer, ForeignKey("nodes.id")),
Column("other_node_id", Integer, ForeignKey("nodes.id")),
Column("other_leaf_id", Integer, ForeignKey("leaves.id"))
)
So if I insert a node, the column "nodes_to_content.c.other_node_id"
would take the id of that inserted node while
"nodes_to_content.c.other_leaf_id" would be null, and if I insert a
leave, the process would be the opposite.
If I use a unique table, I am also a bit concerned of how to retrieve
the objects (what to tell the query, I mean). For the moment I have
always had relationships that returned one type of objects (or objects
that inherited from others), but this would be getting two totally
different objects... So if I want to retrieve all the items of a
MyNode instance, I don't know what to put in the relationship:
class MyNode:
[ ... ]
def getAllNodes():
items = session.query(?????).all() #What to put in ???? ?
"object", maybe?
Thank you in advance!
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.