I so desperately wished you had reported this yesterday before I released. It's an extra load that forgot to get factored out. I may very well release 0.6.3 today as I consider this a very severe issue.
On Jul 7, 2010, at 5:16 AM, Ralph Heinkel wrote: > Hi, > > is SA < 0.6 this problem did not occur. The sample code to demonstrate > the problem is taken from > http://www.sqlalchemy.org/docs/mappers.html#many-to-many > and repeated here for completeness. First let's setup a sample db (all > done in sqlite in my case): > > class Parent(object): > def __init__(self, ID, data): > self.id = ID > self.data = data > > class Child(object): > def __init__(self, ID): > self.id = ID > > left_table = Table('left', metadata, > Column('id', Integer, primary_key=True), > Column('data', Integer)) > > right_table = Table('right', metadata, > Column('id', Integer, primary_key=True)) > > association_table = Table('association', metadata, > Column('left_id', Integer, ForeignKey('left.id')), > Column('right_id', Integer, ForeignKey('right.id')), > ) > > mapper(Parent, left_table, properties={ > 'children': relationship(Child, secondary=association_table, > backref='parents') > }) > > mapper(Child, right_table) > > metadata.create_all(engine) > > # create some sample data > p = Parent(1, 100) > session.add(p) > p.children.append(Child(20)) > p.children.append(Child(30)) > session.commit() > > Now let's load the parent obj, modify the 'data' column, and commit > the change. This should not affect the associated tables, however > their data is loaded: > >>>> p = session.query(Parent).get(1) > 2010-07-07 11:08:42,116 INFO sqlalchemy.engine.base.Engine.0x...360c > BEGIN > 2010-07-07 11:08:42,117 INFO sqlalchemy.engine.base.Engine.0x...360c > SELECT "left".id AS left_id, "left".data AS left_data > FROM "left" > WHERE "left".id = ? > 2010-07-07 11:08:42,118 INFO sqlalchemy.engine.base.Engine.0x...360c > (1,) >>>> p.data = 101 >>>> session.commit() > 2010-07-07 11:08:50,020 INFO sqlalchemy.engine.base.Engine.0x...360c > SELECT "right".id AS right_id > FROM "right", association > WHERE ? = association.left_id AND "right".id = association.right_id > 2010-07-07 11:08:50,020 INFO sqlalchemy.engine.base.Engine.0x...360c > (1,) > 2010-07-07 11:08:50,023 INFO sqlalchemy.engine.base.Engine.0x...360c > UPDATE "left" SET data=? WHERE "left".id = ? > 2010-07-07 11:08:50,024 INFO sqlalchemy.engine.base.Engine.0x...360c > (101, 1) > 2010-07-07 11:08:50,025 INFO sqlalchemy.engine.base.Engine.0x...360c > COMMIT > > > After the 'commit' above a select statement is executed on the > association table. This is new behavior in the 0.6.x series on SA, > wasn't there in versions below.. And it is very stupid for us as we > have huge relations on very few parent tables. All of them will be > loaded just because data is changed in the parent. > > How is it possible to avoid this? > > Any help is appreciated. > > Thanks > > Ralph > > -- > 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. > -- 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.
