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 [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
-~----------~----~----~----~------~----~------~--~---