Thread: [SQLObject] Incorrect join column name
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Matt G. <ma...@po...> - 2003-05-11 22:54:20
|
Hi, I've only recently started experimenting with SQLObject so please forgive me if this turns out to be complete nonsense ;-). There seems to be a problem with the name that is generated for a join column when a class explicitly sets the name of the table (using _table). Here's an example: class Order(SQLObject.SQLObject): _table = 'ordr' _columns = [ SQLObject.IntCol('number', dbName='nmbr'), SQLObject.IntCol('customerID', foreignKey='Customer'), ] _joins = [SQLObject.MultipleJoin('OrderItem'),] class OrderItem(SQLObject.SQLObject): _columns = [ SQLObject.IntCol('orderID', foreignKey='Order'), SQLObject.IntCol('productID', foreignKey='Product'), SQLObject.IntCol('quantity'), ] (Ignore the Customer and Product classes - they're not relevant.) >From the above, SQLObject creates the following tables: CREATE TABLE ordr ( id serial NOT NULL, nmbr integer, customer_id integer ); CREATE TABLE order_item ( id serial NOT NULL, order_id integer, product_id integer, quantity integer ); So far, so good. However when I have an existing Order (with id=1) and I "call" order.orderItems the following SQL is executed: SELECT id FROM order_item WHERE ordr_id = 1 As you can see, ordr_id is wrong - it should be order_id. I started trying to fix the error but realised that I don't actually know what to fix - the table creation code or the join code. i.e. should the created table's column be called ordr_id or should the join SQL use order_id? If someone who understands what SQLObject's *should* be doing can tell me what to fix I will try to send a patch. - Matt |
From: Matt G. <ma...@po...> - 2003-05-11 23:17:29
|
I should have mentioned ... this was using latest CVS HEAD and PostgreSQL 7.3. - Matt On Sun, 2003-05-11 at 23:55, Matt Goodall wrote: > Hi, > > I've only recently started experimenting with SQLObject so please > forgive me if this turns out to be complete nonsense ;-). > > There seems to be a problem with the name that is generated for a join > column when a class explicitly sets the name of the table (using > _table). Here's an example: > > class Order(SQLObject.SQLObject): > _table = 'ordr' > _columns = [ > SQLObject.IntCol('number', dbName='nmbr'), > SQLObject.IntCol('customerID', foreignKey='Customer'), > ] > _joins = [SQLObject.MultipleJoin('OrderItem'),] > > class OrderItem(SQLObject.SQLObject): > _columns = [ > SQLObject.IntCol('orderID', foreignKey='Order'), > SQLObject.IntCol('productID', foreignKey='Product'), > SQLObject.IntCol('quantity'), > ] > > (Ignore the Customer and Product classes - they're not relevant.) > > >From the above, SQLObject creates the following tables: > > CREATE TABLE ordr ( > id serial NOT NULL, > nmbr integer, > customer_id integer > ); > > CREATE TABLE order_item ( > id serial NOT NULL, > order_id integer, > product_id integer, > quantity integer > ); > > So far, so good. However when I have an existing Order (with id=1) and I > "call" order.orderItems the following SQL is executed: > > SELECT id FROM order_item WHERE ordr_id = 1 > > As you can see, ordr_id is wrong - it should be order_id. > > I started trying to fix the error but realised that I don't actually > know what to fix - the table creation code or the join code. i.e. should > the created table's column be called ordr_id or should the join SQL use > order_id? > > If someone who understands what SQLObject's *should* be doing can tell > me what to fix I will try to send a patch. > > - Matt > > > > ------------------------------------------------------- > Enterprise Linux Forum Conference & Expo, June 4-6, 2003, Santa Clara > The only event dedicated to issues related to Linux enterprise solutions > www.enterpriselinuxforum.com > > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss |
From: Ian B. <ia...@co...> - 2003-05-12 01:19:47
|
On Sun, 2003-05-11 at 17:55, Matt Goodall wrote: [...example...] > So far, so good. However when I have an existing Order (with id=1) and I > "call" order.orderItems the following SQL is executed: > > SELECT id FROM order_item WHERE ordr_id = 1 > > As you can see, ordr_id is wrong - it should be order_id. > > I started trying to fix the error but realised that I don't actually > know what to fix - the table creation code or the join code. i.e. should > the created table's column be called ordr_id or should the join SQL use > order_id? I'm not sure what the proper behavior is here -- I think it's correct currently (though for naming things like this there's no One Right Way). The default is that a foreign key column will be named tablename_id, which is exactly what it does. But you want to use the automatically generated table name ("order"), not the explicit name ("ordr"). I think in that case you just need to be explicit, i.e.: MultipleJoin('OrderItem', joinColumn='order_id') Ian |