Maybe actually asking some questions would have helped getting replies :-)
Is this not a bug? I may be wrong, but I would consider this a pretty serious bug, as it does not raise an error, but silently returns the wrong object, which could lead to serious data corruption... If it is, should I just go ahead and open an entry in the tracker? Thanks, On Jul 2, 1:34 pm, Yves-Eric <[EMAIL PROTECTED]> wrote: > Hi all, > > I have just spent most of a day tracking down a weird bug in an > application I built on top of a legacy database, in which I use simple > (non-polymorphic) multi-table inheritance. The problem arises when the > parent and child tables share the same name for their primary key > ("id" in my case), but with different values (each table has its own > sequence). > > I illustrate the problem in the runnable script attached below, using > a Person / Employee hierarchy. Most of the time, everything works fine > (Employee alice1 has the right "alice" Person object). But when an > Employee object is loaded (alice2), for which a Person object with the > same id already exists in the session (bob was loaded, and bob's > person.id happens to be the same as alice's employee.id), then the > wrong parent object is loaded (Employee alice2 has the wrong Person > object "bob"). > > Here is a runnable script that reproduces this bug: > > ### BEGIN: multitable_inheritance_test.py ### > from sqlalchemy import * > > db = create_engine('sqlite://', echo=False) > __meta__ = BoundMetaData(db) > > person_table = Table("persons", __meta__, > Column("id", Integer, primary_key=True), > Column("name", String(80)), > ) > > employee_table = Table("employees", __meta__, > Column("id", Integer, primary_key=True), > Column("salary", Integer), > Column("person_id", Integer, ForeignKey("persons.id")), > ) > > class Person(object): > def __init__(self, name): > self.name = name > > class Employee(Person): pass > > __meta__.create_all() > > person_mapper = mapper(Person, person_table) > mapper(Employee, employee_table, inherits=person_mapper) > > person_insert = person_table.insert() > person_insert.execute(id=1, name='alice') > person_insert.execute(id=2, name='bob') > > employee_insert = employee_table.insert() > employee_insert.execute(id=2, salary=250, person_id=1) # alice > employee_insert.execute(id=3, salary=200, person_id=2) # bob > > session = create_session() > query = session.query(Employee) > > alice1 = query.get(2) > bob = query.get(3) > alice2 = query.get(2) > > print 'alice1.name: %s' % alice1.name > print 'alice2.name: %s' % alice2.name > > ### END ### --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---