[Grok-dev] Modeling a class that extend from list() with megrok.rdb

Hector Blanco white.lists at gmail.com
Tue Oct 26 17:16:22 EDT 2010


Hi guys!

Thank you for your answers.

To Jeff Petterson>
     That's doable, but I would like to avoid (if possible) creating
raw MySQL queries. It turns out I am working with a pre-existent code,
and the system doesn't really uses raw queries. It relies on
sqlalchemy + megrok.rdb and I'd like to keep it consistent (once
again, if possible). I have worked in other projects and I always
prefer going to the lowest level possible (SQL queries "by hand")
because I feel I can control them better, but not in this occasion.

To Santiago Videla>
     I took a look to the containers, but they seem to me just
intermediate tables to define relationships, correct? Well... once
again, I have to deal with the pre-existing code. The guys that
developed it didn't use containers classes. The tables that were used
as intermediate tables to specify relationships where declared in a
lower level (only with sqlalchemy commands). To keep consistency with
the existing code, I'd like to be able to define that intermediate
tables myself.

As I mentioned, the way I have it now is:

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

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

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

       def getByField1(self, field1):
               for element in self:
                       if element.field1 == field1:
                               return element
               return None

       [ ... more useful methods ...]

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 "MyClass" classes descending from
(rdb.Model). I also see clearly the intermediate table for
MyContainer:

#This would be the equivalent to a "rdb.Container", correct, Mr.
Videla? Well... in the current system, it is done "by hand", like
this:
my_containers_table = Table(
	"my_containers_table",
	metadata,
	Column("id", Integer,  primary_key=True),
	Column("my_entry_id", Integer, ForeignKey("my_entries_table.id"))
)

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

I guess MyClass could be modeled with something like:

class MyClass(rdb.Model):
	rdb.metadata(metadata)
	rdb.tablename("my_class_table")
	id = Column("id", Integer, primary_key=True)
	anotherField =  Column("another_field", String(16))
	container1 = Column("container_1", Integer,
ForeignKey("my_containers_table.id")),
	container2 = Column("container_2", Integer,
ForeignKey("my_containers_table.id"))

But now, how do 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 :-)

I know... the existing code is a complicated mix between megrok and
sqlalchemy... but that's what I have to deal with (although if it
needs to be changed because there's no other way, well... I can do it)

Thank you again

2010/10/26 Santiago Videla <santiago.videla at gmail.com>:
> Hi, I am not working with megrok.rdb these days neither with grok... but,
> did you see rdb.Container and rdb.QueryContainer? I am not sure, but maybe
> it could help you with this.
> Regards,
>
> On Mon, Oct 25, 2010 at 7:02 PM, Hector Blanco <white.lists at gmail.com>
> wrote:
>>
>> Hi list!
>>
>> I am trying to migrate my application from ZopeDB to MySql. I am using
>> megrok.rdb.
>>
>> I have a class which inherits from list() and has a few extra methods.
>>
>> That class acts as a container of other classes and 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):
>>        def __init__(self):
>>                super(MyContainer,self).__init__()
>>
>>        def append(myEntry):
>>                if isinstance(myEntry, MyEntry):
>>                        super(MyContainer, self).append(myEntry)
>>
>>        def getByField1(self, field1):
>>                for element in self:
>>                        if element.field1 == field1:
>>                                return element
>>                return None
>>
>>        [ ... more useful methods ...]
>>
>> 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 don't really know how to model this with megrok.rdb. I kind of see
>> clearly (although I may be totally wrong) that MyEntry and MyClass
>> should extend from rdb.Model and each of them should be stored in a
>> table, but I don't really know what to do with “MyContainer”. I'd like
>> to keep it inheriting from list, but I don't know how to model that.
>> It really only needs to be an association between [id, id_of_my_entry]
>> (relationship 1:N). In MyClass, each of the containers would get an id
>> and then, if I want to get the “MyEntries” that are in container1, I
>> just need to get the MyEntries who are linked to that id.
>>
>> … but I have no idea about how to implement that... Any hint I could
>> get would be deeply appreciated.
>>
>> Thank you in advance!
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> https://mail.zope.org/mailman/listinfo/grok-dev
>
>
>
> --
> Santiago Videla
> http://www.linkedin.com/in/svidela
>
> Sigue la mata dando de que hablar siempre abajo y a la izquierda donde el
> pensamiento que se hace corazón resplandece con la palabra sencilla y
> humilde que l at s tod at s somos.
>


More information about the Grok-dev mailing list