Containers/collections with SQLAlchemy

13 views
Skip to first unread message

Hector Blanco

unread,
Oct 26, 2010, 6:39:42 PM10/26/10
to sqlal...@googlegroups.com
Hi group!

I am trying to migrate my application from ZopeDB to MySql. I am using
sqlalchemy under megrok.rdb.

I have a class which inherits from list() and has a few extra methods.
Reading the chapter about custom collections in sqlalchemy
(http://www.sqlalchemy.org/docs/orm/collections.html#custom-collection-implementations),
I thought that I'd be great having that class as a custom collection
(extending from list() but simulating a set(), where the items can't
be repeated)

That class that extends from list, acts as a container of other
classes (mmm... yeah, as all the collections do... pretty obvious). It
is used (as an attribute) in other classes as well:

class MyEntry(object):
def __init__(self):
self.field1 = “field1”
self.field2 = “field2”


class MyContainer(list):
__emulates__ = set
def __init__(self):
super(MyContainer,self).__init__()

def add(self, myEntry):
if isinstance(myEntry, MyEntry):
if not(myEntry in self):
super(MyContainer, self).append(myEntry)

def getByField1(self, field1):
for element in self:
if element.field1 == field1:
return element
return None
# [ ...
# more useful methods,
# overloading to make the list behave like a set,
# yada yada yada
# ...]


class MyClass(object):
def __init__(self):
self.container1 = MyContainer()
self.container2 = MyContainer()
self.anotherField = “hello world”
def getContainer1():
return self.container1
def getContainer2():
return self.container2

I see clearly the "MyEntry" and (more or less clearly) "MyClass"
classes modeled in tables.
I also see clearly the intermediate table for MyContainer:

my_containers_table = Table(
"my_containers_table",
metadata,
Column("id", Integer, primary_key=True),
Column("my_entry_id", Integer, ForeignKey("my_entries_table.id"))
)

So, in the MyClass class, each of MyContainer() instances can have an
id and when someone wants to retrieve the MyEntry() elements that are
in container1 (to say so), the "my_containers_table" can be used as a
middle table to get said MyEntries.

but I don't know how to link the MyContainer(list) object with
my_containers_table (and from there with MyClass) :-(

I'm not even sure whether MyClass.container1 and MyClass.container2
should be ForeignKeys or Relations.

How can I establish the relationship between MyClass.container1 or
MyClass.container2 with "my_containers_table"?

On one hand, I want MyClass.container1 and MyClass.container2 to be
foreign keys, but on the other, I want them to be instances of
MyContainer(list)... And that's where I start banging my head on the
wall :-)

In my mind (preferably before banging it against the wall) I see this schema:

+---Entry----+
| id = 1 |
| "field1" | +----container1---+
| "field2" | | id = 10 |
+-------------+ | foreign[0] = 1 |
| foreign[1] = 2 | +----- myClass ----+
+---Entry---+ +----------------------+ | id = 101 |
| id = 2 | |
anotherField |
| "field1" | |
container1 = 10 |
| "field2" | +----container2---+ | container2 = 20 |
+-------------+ | id = 20 | +---------------------+
| foreign[0] = 3 |
+---Entry---+ +---------------------+
| id = 3 |
| "field1" |
| "field2" |
+------------+

[I hope the Ascii thing is properly displayed]

When I want to get all what is in myClass.container1, the system
should go to my_containers_table with the myClass.container1's id (10)
and retrieve all the "MyEntries" (id=1 and id=2 in the example above)
pointed by the ForeingKey of "my_containers_table". That's what I want
the system to do. But that's not what it's doing.

Any tip will be deeply appreciated. Links to manuals,
documentations... whatever (I'm a total newbie in sqlmyalchemy)

Thank you again!

Jeff Peterson

unread,
Oct 26, 2010, 6:46:42 PM10/26/10
to sqlal...@googlegroups.com
http://grok.zope.org/documentation/how-to/orm-using-megrok.rdb-and-sqlalchemy

http://www.sqlalchemy.org/docs/

--
Jeffrey D Peterson
Webmaster
Crary Industries, Inc.
237 12th St NW
West Fargo, ND 58078
P: 701-499-5928
E: jeff.p...@crary.com

> --
> You received this message because you are subscribed to the Google
> Groups "sqlalchemy" group.
> To post to this group, send email to sqlal...@googlegroups.com.
> To unsubscribe from this group, send email to
> sqlalchemy+...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/sqlalchemy?hl=en.

Reply all
Reply to author
Forward
0 new messages