I tried quite a few combinations and at the end I decided ask experts.
I started with primaryjoin as condition but as soon as I tried to
access anything from the LOT table (outerjoin table) I got error:
Unexpected error: <type 'exceptions.AttributeError'> 'NoneType' object
has no attribute 'CODE'

(I tried to access something like dbItem.lot.CODE)

At that moment I checked the generated SqL and I didn't see any LEFT
OUTER JOINS and decided to something introduce the outerjoin to the
mapper.  As long there is a record in LOT table corresponding to ITEM
everything works fine, but as soon as I hit NULL in foreign key column
I cant access anything (I expect None values - substitute for NULL
values in such case for ALL dbItem.lot.xxxxxxxx )

The LOT table:

CREATE TABLE `ITEM_LOT` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `CODE` varchar(20) NOT NULL,
  `SERIAL_NO` enum('0','1') NOT NULL default '0',
  `COMMENT` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

I just want to outerjoin LOT table to ITEM table (I sent the create in
previous post and this table in mapper) - please remember that the LOT
table has almost no records but I want all records form ITEM table
(typical outerjoin scenario).

the SQL I want to generate is:
SELECT * FROM  ITEM_SKU, ITEM LEFT OUTER JOIN ITEM_LOT ON ITEM_LOT.id
= ITEM.ITEM_LOT_id WHERE ITEM_SKU.id = ITEM.ITEM_SKU_id;


my mapper (current version):
mdbItem = mapper(dbItem, tbl_item,
                 properties={
                             'sku': relation(dbItemSKU,
                                             uselist=False,
 
primaryjoin=tbl_item.c.ITEM_SKU_id==tbl_item_sku.c.id,
 
foreign_keys=[tbl_item.c.ITEM_SKU_id]
                                             ),
                             'lot': relation(dbItemLot,
                                             uselist=False,
 
primaryjoin=tbl_item.c.ITEM_LOT_id==tbl_item_lot.c.id,
 
foreign_keys=[tbl_item.c.ITEM_LOT_id]
                                             )})

I guess I am doing something wrong - I just can't figure out what.

thanks for help.
-- jacek

On Oct 30, 7:11 am, Michael Bayer <[EMAIL PROTECTED]> wrote:
> primaryjoin references a join condition, not a join() object.   so  
> just use the parent_table.c.col==child_table.c.col part of your join()  
> below for primaryjoin.
>
> On Oct 29, 2008, at 10:43 PM, jack2318 wrote:
>
>
>
> > Hi,
> > I have 3 tables - tbl_item, tbl_item_sku, and tbl_item_lot
>
> > Table tbl_item has 2 FKs
>
> > my mapper is pretty simple:
>
> > mdbItem = mapper(dbItem, tbl_item,
> >                 properties={
> >                             'sku': relation(dbItemSKU,
> >                                             uselist=False,
>
> > primaryjoin=tbl_item_sku.c.id==tbl_item.c.ITEM_SKU_id,
>
> > foreign_keys=[tbl_item.c.ITEM_SKU_id]
> >                                             ),
> >                             'lot': relation(dbItemLot,
> >                                             uselist=False,
>
> > primaryjoin
> > =
> > outerjoin
> > (tbl_item_lot,tbl_item,tbl_item.c.ITEM_LOT_id==tbl_item_lot.c.id),
>
> > foreign_keys=[tbl_item.c.ITEM_LOT_id])})
>
> > as soon as I try access anything from tbl_item_lot
>
> > e.g. dbItem.lot.CODE
>
> > I am getting:
> > Unexpected error: <class 'sqlalchemy.exc.ProgrammingError'>
> > (ProgrammingError) (1064, "You have an error in your SQL syntax; check
> > the manual that corresponds to your MySQL server version for the right
> > syntax to use near 'LEFT OUTER JOIN `ITEM` ON 1 = `ITEM_LOT`.id' at
> > line 3") u'SELECT `ITEM_LOT`.id AS `ITEM_LOT_id`, `ITEM_LOT`.`CODE` AS
> > `ITEM_LOT_CODE`, `ITEM_LOT`.`SERIAL_NO` AS `ITEM_LOT_SERIAL_NO`,
> > `ITEM_LOT`.`COMMENT` AS `ITEM_LOT_COMMENT` \nFROM `ITEM_LOT` LEFT
> > OUTER JOIN `ITEM` ON %s = `ITEM_LOT`.id \nWHERE `ITEM_LOT` LEFT OUTER
> > JOIN `ITEM` ON %s = `ITEM_LOT`.id' [1L, 1L]
>
> > if I just access data from first join then everything is fine.
>
> > Another thing is that I have to specify foreign_keys without that I am
> > getting:
> > Unexpected error: <class 'sqlalchemy.exc.ArgumentError'> Could not
> > determine relation direction for primaryjoin condition '`ITEM_SKU`.id
> > = `ITEM`.`ITEM_SKU_id`', on relation dbItem.sku. Specify the
> > 'foreign_keys' argument to indicate which columns on the relation are
> > foreign.
> > even the relations are setup in the database
> > CREATE TABLE `ITEM` (
> >  `id` int(10) unsigned NOT NULL auto_increment,
> >  `ITEM_SKU_id` int(10) unsigned NOT NULL,
> >  `ITEM_LOT_id` int(10) unsigned default NULL,
> >  PRIMARY KEY  (`id`),
> >  KEY `FK_ITEM_LOT` (`ITEM_LOT_id`),
> >  KEY `FK_ITEM_SKU` (`ITEM_SKU_id`),
> >  CONSTRAINT `FK_ITEM_LOT` FOREIGN KEY (`ITEM_LOT_id`) REFERENCES
> > `ITEM_LOT` (`id`),
> >  CONSTRAINT `FK_ITEM_SKU` FOREIGN KEY (`ITEM_SKU_id`) REFERENCES
> > `ITEM_SKU` (`id`)
> > ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
>
> > I guess I need help :-)
>
> > regards
> > -- jacek
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to