very nice - this fix is applied in r5314. It's not every day someone gives us a patch for strategies.py...have any more ? :)
On Nov 20, 2008, at 9:47 PM, Yoann Roman wrote: > > I'm getting invalid SQL when I try to filter for records that have no > matching related record in a one-to-one relationship using the not_ > function. For example, with address being a relation from User: > >>>> print User.id==None > users.id IS NULL >>>> print not_(User.id==None) > users.id IS NOT NULL >>>> print User.address==None > users.address_id IS NULL >>>> print not_(User.address==None) > users.address_id != NULL > > The last expression fails to return the correct records against MySQL. > Below is a complete test script to reproduce the above output: > > from sqlalchemy import create_engine, Table, Column, Integer, String, > Text, \ > MetaData, ForeignKeyConstraint, not_ > from sqlalchemy.orm import mapper, relation, sessionmaker > > # initialize the engine > engine = create_engine('sqlite:///:memory:', echo=False) > metadata = MetaData() > > # setup the users table > users = Table('users', metadata, > Column('id', Integer, primary_key=True), > Column('name', String(50)), > Column('address_id', Integer), > ForeignKeyConstraint(['address_id'], ['addresses.id']) > ) > > # setup the addresses table > addresses = Table('addresses', metadata, > Column('id', Integer, primary_key=True), > Column('address', Text), > ) > > # create the tables > metadata.create_all(engine) > > # define the User class > class User(object): > def __repr__(self): > return '<User "%s">' % self.name > > # define the Address class > class Address(object): > def __repr__(self): > return '<Address "%s">' % self.address > > # setup the mapping > mapper(Address, addresses) > mapper(User, users, properties={ > 'address': relation(Address, backref='user') > }) > > # create the session > Session = sessionmaker(bind=engine) > > # perform the tests > print User.id==None > print not_(User.id==None) > print User.address==None > print not_(User.address==None) > > A possible fix seems to be to add "binary.negate = operators.isnot" > below lines 394 and 397 of orm/strategies.py > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---