Thread: [SQLObject] SQLRelatedJoings: otherColumn with custom join table?
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <ber...@zk...> - 2007-03-09 12:24:24
|
Hi all! I'd like to use a related join with a custom join table and non-standar= d property names on the join table. Something like this: # ---------------------------------- class VoidFoo(sqlobject.SQLObject): fooDooh =3D sqlobject.ForeignKey('Foo') voidDooh =3D sqlobject.ForeignKey('Void') class Void(sqlobject.SQLObject): foos =3D sqlobject.SQLRelatedJoin('Foo', intermediateTable =3D 'voi= d_foo', otherColumn =3D 'foo_dooh_id', createRelatedTable =3D False) class Foo(sqlobject.SQLObject): voids =3D sqlobject.SQLRelatedJoin('Void', intermediateTable =3D 'void_foo', otherColumn =3D 'void_dooh_id', createRelatedTable =3D Fals= e) Void.createTable() Foo.createTable() VoidFoo.createTable() foo =3D Foo() foo.addVoid(Void()) # ---------------------------------- This is the SQL output: 1/Query : ALTER TABLE void_foo ADD CONSTRAINT void_foo_foo_dooh_id_exists FOREIGN KEY (foo_dooh_id) REFERENCES foo (i= d) 1/Query : ALTER TABLE void_foo ADD CONSTRAINT void_foo_void_dooh_id_exists FOREIGN KEY (void_dooh_id) REFERENCES void= (id) 1/QueryIns: INSERT INTO foo () VALUES () 1/QueryOne: SELECT NULL FROM foo WHERE id =3D (1) 1/QueryIns: INSERT INTO void () VALUES () 1/QueryOne: SELECT NULL FROM void WHERE id =3D (1) 1/Query : INSERT INTO void_foo (foo_id, void_dooh_id) VALUES (1, 1)= And that's the error I'm getting: sqlobject.dberrors.OperationalError: Unknown column 'foo_id' in 'fiel= d list' Apparently, the fooDoo isn't properly resolved to foo_doo_id but instea= d to its default name foo_id. Is this a bug or am I just doing something wro= ng? Thanks a lot! Bernhard ___________________________________________________________________ Disclaimer: Diese Mitteilung ist nur fuer die Empfaengerin / den Empfaenger bestimm= t. Fuer den Fall, dass sie von nichtberechtigten Personen empfangen wird, bitten wir diese hoeflich, die Mitteilung an die ZKB zurueckzusenden un= d anschliessend die Mitteilung mit allen Anhaengen sowie allfaellige Kopi= en zu vernichten bzw. zu loeschen. Der Gebrauch der Information ist verbot= en. This message is intended only for the named recipient and may contain confidential or privileged information. If you have received it in error, please advise the sender by return e-= mail and delete this message and any attachments. Any unauthorised use or dissemination of this information is strictly prohibited.= |
From: Oleg B. <ph...@ph...> - 2007-03-09 12:58:17
|
On Fri, Mar 09, 2007 at 01:24:16PM +0100, ber...@zk... wrote: > # ---------------------------------- > class VoidFoo(sqlobject.SQLObject): > fooDooh = sqlobject.ForeignKey('Foo') > voidDooh = sqlobject.ForeignKey('Void') > > class Void(sqlobject.SQLObject): > foos = sqlobject.SQLRelatedJoin('Foo', intermediateTable = 'void_foo', > otherColumn = 'foo_dooh_id', createRelatedTable = False) > > class Foo(sqlobject.SQLObject): > voids = sqlobject.SQLRelatedJoin('Void', intermediateTable = > 'void_foo', otherColumn = 'void_dooh_id', createRelatedTable = False) > > Void.createTable() > Foo.createTable() > VoidFoo.createTable() > > foo = Foo() > foo.addVoid(Void()) > # ---------------------------------- > > 1/Query : INSERT INTO void_foo (foo_id, void_dooh_id) VALUES (1, 1) > > And that's the error I'm getting: > sqlobject.dberrors.OperationalError: Unknown column 'foo_id' in 'field > list' > > Apparently, the fooDoo isn't properly resolved to foo_doo_id but instead to > its default name foo_id. Is this a bug or am I just doing something wrong? RelatedJoin cannot see "fooDooh" in VoidFoo definition. You have to help it to name the column using "joinColumn" keyword: class Void(sqlobject.SQLObject): foos = sqlobject.SQLRelatedJoin('Foo', intermediateTable = 'void_foo', joinColumn = 'void_dooh_id', otherColumn = 'foo_dooh_id', createRelatedTable = False) class Foo(sqlobject.SQLObject): voids = sqlobject.SQLRelatedJoin('Void', intermediateTable = 'void_foo', joinColumn = 'foo_dooh_id', otherColumn = 'void_dooh_id', createRelatedTable = False) Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: <ber...@zk...> - 2007-03-12 07:37:28
|
Hi Oleg > > RelatedJoin cannot see "fooDooh" in VoidFoo definition. You have t= o help > it to name the column using "joinColumn" keyword: > > class Void(sqlobject.SQLObject): > foos =3D sqlobject.SQLRelatedJoin('Foo', intermediateTable =3D 'void_foo', > joinColumn =3D 'void_dooh_id', otherColumn =3D 'foo_dooh_id',= > createRelatedTable =3D False) > > class Foo(sqlobject.SQLObject): > voids =3D sqlobject.SQLRelatedJoin('Void', intermediateTable =3D 'void_foo', > joinColumn =3D 'foo_dooh_id', otherColumn =3D 'void_dooh_id',= > createRelatedTable =3D False) > Ah, now I got it. Looks like I didn't read the documentation too thoroughly, it's all the= re in that example... Thanks! Bernhard ___________________________________________________________________ Disclaimer: Diese Mitteilung ist nur fuer die Empfaengerin / den Empfaenger bestimm= t. Fuer den Fall, dass sie von nichtberechtigten Personen empfangen wird, bitten wir diese hoeflich, die Mitteilung an die ZKB zurueckzusenden un= d anschliessend die Mitteilung mit allen Anhaengen sowie allfaellige Kopi= en zu vernichten bzw. zu loeschen. Der Gebrauch der Information ist verbot= en. This message is intended only for the named recipient and may contain confidential or privileged information. If you have received it in error, please advise the sender by return e-= mail and delete this message and any attachments. Any unauthorised use or dissemination of this information is strictly prohibited.= |