Surprised no one has hit this one yet.
When issuing a series of deletes in a UOW, SA issues the bogus delete
statement
DELETE child where id = [1,2,3]
instead of using IN()
Test case attached. Seems to work in Sqlite even while issuing the bogus SQL
(which is probably why a unit test didn't pick it up), but MS-SQL doesn't
like it; didn't check PG or others.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
from sqlalchemy import *
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
#metadata = BoundMetaData('mssql://d:[EMAIL PROTECTED]/drvtest')
metadata = BoundMetaData('sqlite:///:memory:')
entity = Table('entity', metadata,
Column('id', INT, primary_key=True, nullable=False),
Column('typ', VARCHAR(12)),
Column('lname', VARCHAR(128))
)
entityattr = Table('entityattr', metadata,
Column('id', INT, primary_key=True, nullable=False),
Column('ident', INT, ForeignKey('entity.id'), nullable=False),
Column('typ', VARCHAR(12), nullable=False),
Column('val', VARCHAR(128))
)
metadata.create_all()
class O(object):
def __init__(self,**kw):
for k,v in kw.items():
setattr(self,k,v)
class Ent(O): pass
class Entattr(O): pass
mapper(Ent, entity, properties = {'props':relation(Entattr, cascade="all, delete-orphan")})
mapper(Entattr, entityattr)
S = create_session()
S.save(Ent(typ='A',lname='A',
props = [Entattr(typ='A1', val='1'),
Entattr(typ='A2', val='2'),
Entattr(typ='A3', val='3'),
Entattr(typ='A4', val='4'),
Entattr(typ='A5', val='5'),
Entattr(typ='A6', val='6')
]))
S.flush()
S.clear()
e = S.query(Ent).options(eagerload('props')).select()[0]
# remove some attributes
e.props = [p for p in e.props if 0 == int(p.val) % 2]
# put some back
e.props.append(Entattr(typ='A6', val='6'))
e.props.append(Entattr(typ='A7', val='7'))
e.props.append(Entattr(typ='A8', val='8'))
S.flush() # <-- Delete issued here
S.clear()
e = S.query(Ent).options(eagerload('props')).select()[0]
assert 6 == len(e.props)
metadata.drop_all()