OK, still one problem. It's not saving the association object.

Here is the code

===================================
from sqlalchemy import create_engine
from sqlalchemy import Table, Integer, Column, Boolean, String, MetaData,
ForeignKey
from sqlalchemy.orm import mapper, sessionmaker, relationship

from Entities.Calendar import Calendar
from Entities.SimpleCalendar import SimpleCalendar
from Entities.UnionCalendar import UnionCalendar
from Entities.Holiday import Holiday
from Entities.SimpleHoliday import SimpleHoliday
from Entities.RepeatingHoliday import RepeatingHoliday

engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()

Session = sessionmaker(bind=engine)
session = Session()

calendars_table = Table \
   (
   'calendars',
   metadata,
   Column ('id', Integer, primary_key=True),
   Column ('code', String, nullable=False, unique=True),
   Column ('name', String),
   Column ('calendar_type', String (20), nullable=False),
   Column ('monday', Boolean),
   Column ('tuesday', Boolean),
   Column ('wednesday', Boolean),
   Column ('thurday', Boolean),
   Column ('friday', Boolean),
   Column ('saturday', Boolean),
   Column ('sunday', Boolean)
   )

calendar_children_table = Table \
   (
   'calendar_children',
   metadata,
   Column ('parent_id', Integer, ForeignKey ('calendars.id')),
   Column ('child_id',  Integer, ForeignKey ('calendars.id'))
   )

calendar_mapper = \
   mapper \
       (
       Calendar,
       calendars_table,
       polymorphic_on=calendars_table.c.calendar_type,
       polymorphic_identity="calendar"
       )

simple_calendar_mapper = \
   mapper \
       (
       SimpleCalendar,
       inherits=calendar_mapper,
       polymorphic_identity='simple',
       properties=
           {
           'holidays':relationship
               (
               Holiday,
               backref='calendar'
               )
           }
       )
union_calendar_mapper = \
   mapper \
       (
       UnionCalendar,
       inherits=calendar_mapper,
       polymorphic_identity='union',
       properties = \
           {
           'children':relationship \
               (
               Calendar,
               secondary=calendar_children_table,
               primaryjoin   = calendar_children_table.c.parent_id ==
calendars_table.c.id,
               secondaryjoin = calendar_children_table.c.child_id  ==
calendars_table.c.id
               )
           }
       )

holidays_table = Table \
   (
   'holidays',
   metadata,
   Column ('id',          Integer, primary_key=True),
   Column ('holiday_type',        String(20),  nullable=False),
   Column ('calendar_id', Integer, ForeignKey ('calendars.id')),
   Column ('description', String ),
   Column ('year',        Integer),
   Column ('month',       Integer),
   Column ('day',         Integer)
   )

holiday_mapper           = mapper (Holiday,          holidays_table,
polymorphic_on=holidays_table.c.holiday_type,
polymorphic_identity='holiday')
repeating_holiday_mapper = mapper (RepeatingHoliday,
inherits=holiday_mapper, polymorphic_identity='repeating')
simple_holiday_mapper    = mapper (SimpleHoliday,
 inherits=holiday_mapper, polymorphic_identity='simple')

metadata.create_all (engine)

ny = SimpleCalendar(code='NY',name='New York',holidays=[SimpleHoliday("New
Year", 2011,1,1)])
lon = SimpleCalendar(code='LON',name='London',holidays=[SimpleHoliday("New
Year", 2011,1,1),RepeatingHoliday('MayDay',5,1)])
session.add (ny)
session.add (lon)
session.commit()
uc = UnionCalendar ([ny, lon])
print uc
print 'add'
session.add (uc)
session.flush()
session.commit()
print 'done'

for c in uc.children:
   print c.code
=========================================================

And this is the output ignoring the creation parts

=========================================================
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 ()
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 COMMIT
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 BEGIN
(implicit)
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO calendars (code, name, calendar_type, monday, tuesday, wednesday,
thurday, friday, saturday, sunday) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 ('NY',
'New York', 'simple', False, False, False, None, False, True, True)
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO calendars (code, name, calendar_type, monday, tuesday, wednesday,
thurday, friday, saturday, sunday) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,812 INFO sqlalchemy.engine.base.Engine.0x...14b0 ('LON',
'London', 'simple', False, False, False, None, False, True, True)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO holidays (holiday_type, calendar_id, description, year, month, day)
VALUES (?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0
('simple', 1, 'New Year', 2011, 1, 1)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO holidays (holiday_type, calendar_id, description, year, month, day)
VALUES (?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0
('simple', 2, 'New Year', 2011, 1, 1)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO holidays (holiday_type, calendar_id, description, year, month, day)
VALUES (?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0
('repeating', 2, 'MayDay', None, 5, 1)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 COMMIT
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 BEGIN
(implicit)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 SELECT
calendars.id AS calendars_id, calendars.code AS calendars_code,
calendars.name AS calendars_name, calendars.calendar_type AS
calendars_calendar_type, calendars.monday AS calendars_monday,
calendars.tuesday AS calendars_tuesday, calendars.wednesday AS
calendars_wednesday, calendars.thurday AS calendars_thurday,
calendars.friday AS calendars_friday, calendars.saturday AS
calendars_saturday, calendars.sunday AS calendars_sunday
FROM calendars
WHERE calendars.id = ? AND calendars.calendar_type IN (?)
2011-03-31 11:22:40,826 INFO sqlalchemy.engine.base.Engine.0x...14b0 (1,
'simple')
2011-03-31 11:22:40,874 INFO sqlalchemy.engine.base.Engine.0x...14b0 SELECT
calendars.id AS calendars_id, calendars.code AS calendars_code,
calendars.name AS calendars_name, calendars.calendar_type AS
calendars_calendar_type, calendars.monday AS calendars_monday,
calendars.tuesday AS calendars_tuesday, calendars.wednesday AS
calendars_wednesday, calendars.thurday AS calendars_thurday,
calendars.friday AS calendars_friday, calendars.saturday AS
calendars_saturday, calendars.sunday AS calendars_sunday
FROM calendars
WHERE calendars.id = ? AND calendars.calendar_type IN (?)
2011-03-31 11:22:40,874 INFO sqlalchemy.engine.base.Engine.0x...14b0 (2,
'simple')
<UnionCalendar (NY, LON)>

*add
2011-03-31 11:22:40,874 INFO sqlalchemy.engine.base.Engine.0x...14b0 INSERT
INTO calendars (code, name, calendar_type, monday, tuesday, wednesday,
thurday, friday, saturday, sunday) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2011-03-31 11:22:40,874 INFO sqlalchemy.engine.base.Engine.0x...14b0 (u'NY
LON', u'New York - London', 'union', None, None, None, None, None, None,
None)
2011-03-31 11:22:40,874 INFO sqlalchemy.engine.base.Engine.0x...14b0 COMMIT
done*
2011-03-31 11:22:40,890 INFO sqlalchemy.engine.base.Engine.0x...14b0 BEGIN
(implicit)
*2011-03-31 11:22:40,905 INFO sqlalchemy.engine.base.Engine.0x...14b0 SELECT
calendars.id AS calendars_id, calendars.code AS calendars_code,
calendars.name AS calendars_name, calendars.calendar_type AS
calendars_calendar_type, calendars.monday AS calendars_monday,
calendars.tuesday AS calendars_tuesday, calendars.wednesday AS
calendars_wednesday, calendars.thurday AS calendars_thurday,
calendars.friday AS calendars_friday, calendars.saturday AS
calendars_saturday, calendars.sunday AS calendars_sunday
FROM calendars
WHERE calendars.id = ? AND calendars.calendar_type IN (?)
2011-03-31 11:22:40,905 INFO sqlalchemy.engine.base.Engine.0x...14b0 (3,
'union')
2011-03-31 11:22:40,905 INFO sqlalchemy.engine.base.Engine.0x...14b0 SELECT
calendars.id AS calendars_id, calendars.code AS calendars_code,
calendars.name AS calendars_name, calendars.calendar_type AS
calendars_calendar_type, calendars.monday AS calendars_monday,
calendars.tuesday AS calendars_tuesday, calendars.wednesday AS
calendars_wednesday, calendars.thurday AS calendars_thurday,
calendars.friday AS calendars_friday, calendars.saturday AS
calendars_saturday, calendars.sunday AS calendars_sunday
FROM calendars, calendar_children
WHERE calendar_children.parent_id = ? AND calendar_children.child_id =
calendars.id*
2011-03-31 11:22:40,905 INFO sqlalchemy.engine.base.Engine.0x...14b0 (3,)
=========================================================

Now, the save doesn't put anything in the caledar_children table.

The read on the other hand, does and to my eye looks correct.

Any help? I suspect something missing on the mapper.

Thanks

If you want, when it's working I'll produce a cut down version as a pattern
for the documentation.

Nick

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
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