Thread: [SQLObject] Re: SQLObject inheritance patch 2
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Daniel S. <sa...@gn...> - 2004-02-11 15:27:28
|
Hello, For those that need a downloadable version of my inheritance patch, here is the URL: http://www.xsoli.com/sqlobject-inheritance-2.patch Daniel Savard Oleg Broytmann wrote: >Hello! > > I cannot find a downloadable version of the patch. ianbicking.org is >down, and mail archive on the sf.net is not suitable to download >attachments. > Can you send the latest version directly to me, please? Thank you in >advance. Is the patch for SQLObject 2.5.1? Mail archive mentioned 2.8.1, >but I suppose it's just a typo? :) Or should I download the latest >version from CVS? > >Oleg. > > |
From: Oleg B. <ph...@ph...> - 2004-02-11 19:47:44
|
Hi! I tried a simplest test. import SQLObject from db import db_conn class Woman(SQLObject.SQLObject): _inheritable = 1 _connection = db_conn name = SQLObject.StringCol() class Wilma(Woman): smile = SQLObject.IntCol() wilma = Wilma.new(name="Wilma", smile=1) barney = Barney.new(passion=wilma) woman = Woman(1) print woman # prints <Wilma 1 childName=None smile=1>, ok print woman.smile # => 1 print woman.name Traceback (most recent call last): File "test.py", line 10, in ? print woman.name File "<string>", line 1, in <lambda> AttributeError: 'Wilma' object has no attribute '_parent' Oops. I found many places in the code where _parent attribute is used, but only one where it is assigned - in new(). Shouldn't it be assigned in __new__ too? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Daniel S. <sa...@gn...> - 2004-02-12 03:38:45
|
Hello Oleg, I tried your test with MySQL and PostGreSQL under Python 2.2.3 and 2.3.3 and it worked well. What database are you using ? Did you create the table (createTable method) ? You should add theses two lines after class creation: Woman.createTable(1) Wilma.createTable(1) I tried your sample without creating the table and get the same problem as your. Adding theses two lines just after the class creation corrected it. Daniel Savard Oleg Broytmann wrote: >Hi! > > I tried a simplest test. > >import SQLObject >from db import db_conn > > >class Woman(SQLObject.SQLObject): > _inheritable = 1 > _connection = db_conn > > name = SQLObject.StringCol() > > >class Wilma(Woman): > smile = SQLObject.IntCol() > > >wilma = Wilma.new(name="Wilma", smile=1) >barney = Barney.new(passion=wilma) > >woman = Woman(1) >print woman # prints <Wilma 1 childName=None smile=1>, ok >print woman.smile # => 1 >print woman.name > >Traceback (most recent call last): > File "test.py", line 10, in ? > print woman.name > File "<string>", line 1, in <lambda> >AttributeError: 'Wilma' object has no attribute '_parent' > > Oops. I found many places in the code where _parent attribute is >used, but only one where it is assigned - in new(). Shouldn't it be >assigned in __new__ too? > >Oleg. > > |
From: Oleg B. <ph...@ph...> - 2004-02-12 09:48:56
|
On Wed, Feb 11, 2004 at 10:40:31PM -0500, Daniel Savard wrote: > I tried your test with MySQL and PostGreSQL under Python 2.2.3 and > 2.3.3 and it worked well. > What database are you using ? Python 2.3.3, Postgres, SQLObject 0.5.1 with your patch. > Did you create the table (createTable method) ? But of course! :) > You should add theses two lines after class creation: > Woman.createTable(1) > Wilma.createTable(1) I did it this way: Woman.dropTable(ifExists=True) Woman.createTable() Wilma.dropTable(ifExists=True) Wilma.createTable() Of course I do not do it on every invocation of the program. > I tried your sample without creating the table and get the same > problem as your. > Adding theses two lines just after the class creation corrected it. Still don't work. Well, at least I know it is possible. Where the _parent attribute should be created? May be I applied the patch wrong way (though I didn't see any errors/rejects). Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Daniel S. <sa...@gn...> - 2004-02-12 13:48:36
Attachments:
wilma.py
SQLObject.py
|
Hello Oleg, I sent you a little test (your test with very smalls modifications) and the complete SQLObject.py file patched with my patch. It is not needed to create and drop table each time. Only to be sure they are created. Can you try it and tell me if its works now ? As for assigning the _parent variable only in new, it is needed because we must link to the true instance of the parent class at this time to be able to get the good properties. thanks, Daniel Savard Oleg Broytmann wrote: >On Wed, Feb 11, 2004 at 10:40:31PM -0500, Daniel Savard wrote: > > >> I tried your test with MySQL and PostGreSQL under Python 2.2.3 and >>2.3.3 and it worked well. >> What database are you using ? >> >> > > Python 2.3.3, Postgres, SQLObject 0.5.1 with your patch. > > >> Did you create the table (createTable method) ? >> >> > > But of course! :) > > >> You should add theses two lines after class creation: >>Woman.createTable(1) >>Wilma.createTable(1) >> >> > > I did it this way: > >Woman.dropTable(ifExists=True) >Woman.createTable() > >Wilma.dropTable(ifExists=True) >Wilma.createTable() > > Of course I do not do it on every invocation of the program. > > > >> I tried your sample without creating the table and get the same >>problem as your. >> Adding theses two lines just after the class creation corrected it. >> >> > > Still don't work. Well, at least I know it is possible. > > Where the _parent attribute should be created? May be I applied the >patch wrong way (though I didn't see any errors/rejects). > >Oleg. > > |
From: Oleg B. <ph...@ph...> - 2004-02-12 14:40:17
|
On Thu, Feb 12, 2004 at 08:51:06AM -0500, Daniel Savard wrote: > I sent you a little test (your test with very smalls modifications) > and the complete SQLObject.py file patched with my patch. Your SQLObject.py is exactly like my - byte to byte. No difference. > It is not needed to create and drop table each time. Only to be > sure they are created. > Can you try it and tell me if its works now ? Your test works ok. But the following program does not: import SQLObject db_conn = SQLObject.PostgresConnection(db = 'test') class Woman(SQLObject.SQLObject): _inheritable = 1 _connection = db_conn name = SQLObject.StringCol() class Wilma(Woman): smile = SQLObject.IntCol() woman = Woman(1) print woman # prints <Wilma 1 childName=None smile=1>, ok print woman.smile # => 1 print woman.name Output: <Wilma 1 childName=None smile=1> 1 Traceback (most recent call last): File "w2", line 15, in ? print woman.name File "<string>", line 1, in <lambda> AttributeError: 'Wilma' object has no attribute '_parent' > As for assigning the _parent variable only in new, it is needed > because we must link to the true instance of the parent class at this > time to be able to get the good properties. Aha, I see the problem now. Your patch works only when a program creates a new object. Than the class got _parent attribute. If the program does not calls new() - oops, attribute error. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |