[Grok-dev] Tables Relationship in Python/Grok (MeGrok - SqlAlchemy)

Hector Blanco white.lists at gmail.com
Thu Oct 21 15:42:45 EDT 2010


Hi! How are you doing today?

I'm writing because I have a database problem. I am trying to migrate a
Grok/Zope application from ZopeDB to MySql, and I don't know exactly how to
specify one of the relationships between tables... I am using “megrok.rdb”
and “sqlalchemy”.

I have four classes involved:

   1. A record with some information (let's say name and address of people)
   2. A class that can store records of the aforesaid type (it's basically a
   class that behaves as a list)
   3. A “manager” that has some other information and two of instances of
   the class who stores entries (two lists)
   4. An “external” (external to all this assembly) class that uses one of
   these managers.


For the example, the external class looks like:

class External(rdb.Model):
   rdb.metadata(metadata)
    rdb.tablename("externals")

   id = Column("id", Integer, primary_key=True)
    title = Column("title", String(100))
   moreStuff = Column("more_stuff", Integer(unsigned=True))
    entryManager = relationship("EntryManager", secondary="entry_managers"")

And then:

class Entry(rdb.Model):
    rdb.metadata(metadata)
   rdb.tablename("entries")
    id=Column("id", Integer, primary_key=True)
   name = Column("name", String(16))
    address = Column("address", String(16))

   def __init__(self):
        self.data = “hello”

class EntryContainer( ? ? ? ):
*    #I really don't know very well what to do with this*
   def __init__(self):
        self.__list = list()

class EntryManager(rdb.Model):
    rdb.metadata(metadata)
   rdb.tablename("entry_managers")
    id=Column("id", Integer, primary_key=True)
   myOtherStuff = Column("my_other_stuff", String(16))
    containerA = EntryContainer()
   containerB = EntryContainer()

My guess is that I don't really need the EntryContainer to be a
rdb.Model. It could just be an intermediate table of the type [id,
id_of_entry].

How can I tell to the system that containerA and containerB have to
use that “intermediate” table?. I tried something like:

entries_container = Table(
   "entries_container",
    metadata,
   Column("id", Integer, primary_key=True),
    Column("entry_id", Integer, ForeignKey("backup_entries.id"))
)

class EntryManager(rdb.Model):
    rdb.metadata(metadata)
   rdb.tablename("entry_managers")
    id=Column("id", Integer, primary_key=True)
   myOtherStuff = Column("my_other_stuff", String(16))
    containerA = relationship("Entry", secondary="entries_container",
backref="backup_entries")
    containerB = relationship("Entry", secondary="entries_container",
backref="backup_entries")

but I am not capable of using containerA and containerB as a regular
list() object... Something is failing. When I try to set up the tables
it says:

*ArgumentError: Could not determine join condition between parent/child
tables on relationship EntryManager.containerA. Specify a
'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin'
is needed as well.*

Thank you very much
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/grok-dev/attachments/20101021/5c312996/attachment.html 


More information about the Grok-dev mailing list