Thread: [SQLObject] InheritableSQLObject and MultipleJoin
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Peter K. <pk...@gm...> - 2005-08-29 18:15:13
|
I'm having trouble when using InheritableSQLObject when there is a MultipleJoin field in the base class. Here's some sample code: import os from sqlobject import StringCol from sqlobject import SQLObject from sqlobject.inheritance import InheritableSQLObject from sqlobject import MultipleJoin from sqlobject import ForeignKey db_name =3D '/tmp/mgr3.db' if os.path.isfile(db_name): os.unlink(db_name) #conn =3D sqlobject.SQLiteConnection(db_name) conn =3D 'sqlite://' + db_name class Resource(InheritableSQLObject): _connection =3D conn name =3D StringCol() configurations =3D MultipleJoin('Configuration', joinColumn=3D'config_i= d') class Configuration(SQLObject): _connection =3D conn setup =3D StringCol() resource =3D ForeignKey('Resource') class Port(Resource): _connection =3D conn _inheritable =3D False classification =3D StringCol() device =3D ForeignKey('Device') #configurations =3D MultipleJoin('Configuration', joinColumn=3D'config_= id') class Device(Resource): _connection =3D conn _inheritable =3D False location =3D StringCol() ports =3D MultipleJoin('Port', joinColumn=3D'port_id') #configurations =3D MultipleJoin('Configuration', joinColumn=3D'config_= id') Resource.createTable() Configuration.createTable() Port.createTable() Device.createTable() r1 =3D Resource(name=3D'r1') print r1 c1 =3D Configuration(setup=3D'/tmp/xyzzy.sh', resource=3Dr1) print c1 d1 =3D Device(name=3D'a device', location=3D'mars') print d1 c2 =3D Configuration(setup=3D'/tmp/fubar.sh', resource=3Dd1) print c2 for name in ['p1', 'p2', 'p3', 'p4']: p =3D Port(name=3Dname, classification=3D'T1', device=3Dd1) print p Running the code gives me the following traceback: Traceback (most recent call last): File "x.py", line 29, in ? class Port(Resource): File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.egg/sq= lobject/declarative.py", line 94, in __new__ cls.__classinit__(cls, new_attrs) File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.egg/sq= lobject/main.py", line 774, in __classinit__ cls._notifyFinishClassCreation() File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.egg/sq= lobject/inheritance/__init__.py", line 190, in _notifyFinishClassCreation cls.sqlmeta.addJoin(None) File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.egg/sq= lobject/inheritance/__init__.py", line 117, in addJoin join =3D jdef.withClass(soClass) AttributeError: 'SOMultipleJoin' object has no attribute 'withClass' It looks like the MultipleJoin in the Resource class is causing problems with the Port class. When I remove the MultipleJoin from the Resource class and put it into the Port and Device classes the code works. I can use this as a work around for now, but I was hoping to find out if this is a know bug or if I should submit a new bug. Thanks! - Peter |
From: Oleg B. <ph...@ph...> - 2005-08-30 09:55:18
|
On Mon, Aug 29, 2005 at 11:15:01AM -0700, Peter Kropf wrote: > File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.egg/sqlobject/inheritance/__init__.py", > line 117, in addJoin > join = jdef.withClass(soClass) > AttributeError: 'SOMultipleJoin' object has no attribute 'withClass' Can you try to replace for jdef in soClass._parentClass.sqlmeta.joins: join = jdef.withClass(soClass) with for join in soClass._parentClass.sqlmeta.joins: and report if it helps? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Peter K. <pk...@gm...> - 2005-08-30 15:44:38
|
Much better. My sample code now works and the schema generated looks to be what I would expect. You have my thanks! - Peter On 8/30/05, Oleg Broytmann <ph...@ph...> wrote: > On Mon, Aug 29, 2005 at 11:15:01AM -0700, Peter Kropf wrote: > > File "/usr/lib/python2.4/site-packages/SQLObject-0.7dev_r945-py2.4.eg= g/sqlobject/inheritance/__init__.py", > > line 117, in addJoin > > join =3D jdef.withClass(soClass) > > AttributeError: 'SOMultipleJoin' object has no attribute 'withClass' >=20 > Can you try to replace >=20 > for jdef in soClass._parentClass.sqlmeta.joins: > join =3D jdef.withClass(soClass) >=20 > with >=20 >=20 > for join in soClass._parentClass.sqlmeta.joins: >=20 > and report if it helps? >=20 > Oleg. > -- > Oleg Broytmann http://phd.pp.ru/ ph...@ph... > Programmers don't die, they just GOSUB without RETURN. > |
From: Oleg B. <ph...@ph...> - 2005-08-30 15:56:25
|
On Tue, Aug 30, 2005 at 08:44:29AM -0700, Peter Kropf wrote: > On 8/30/05, Oleg Broytmann <ph...@ph...> wrote: > > for jdef in soClass._parentClass.sqlmeta.joins: > > join = jdef.withClass(soClass) > > > > with > > > > > > for join in soClass._parentClass.sqlmeta.joins: The bugfix is committed at the revision 967. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |