- the "dont_load=True" flag on Session.merge() is deprecated
and is now "load=False".
+ - `expression.null()` is fully understood the same way
+ None is when comparing an object/collection-referencing
+ attribute within query.filter(), filter_by(), etc.
+ [ticket:1415]
+
- many-to-one relations now fire off a lazyload in fewer
cases, including in most cases will not fetch the "old"
value when a new one is replaced.
MANYTOMANY, MANYTOONE, MapperProperty, ONETOMANY, PropComparator,
StrategizedProperty,
)
+from types import NoneType
__all__ = ('ColumnProperty', 'CompositeProperty', 'SynonymProperty',
'ComparableProperty', 'RelationProperty', 'BackRef')
__hash__ = None
def __eq__(self, other):
- if other is None:
+ if isinstance(other, (NoneType, expression._Null)):
if self.property.direction in [ONETOMANY, MANYTOMANY]:
return ~self._criterion_exists()
else:
return ~self._criterion_exists(criterion)
def __ne__(self, other):
- if other is None:
+ if isinstance(other, (NoneType, expression._Null)):
if self.property.direction == MANYTOONE:
return sql.or_(*[x!=None for x in self.property._foreign_keys])
else:
# generates an IS NULL
assert [] == sess.query(Address).filter(Address.user == None).all()
+ assert [] == sess.query(Address).filter(Address.user == null()).all()
assert [Order(id=5)] == sess.query(Order).filter(Order.address == None).all()
# many to one generates IS NULL
assert [] == sess.query(Address).filter_by(user = None).all()
+ assert [] == sess.query(Address).filter_by(user = null()).all()
# one to many generates WHERE NOT EXISTS
assert [User(name='chuck')] == sess.query(User).filter_by(addresses = None).all()
+ assert [User(name='chuck')] == sess.query(User).filter_by(addresses = null()).all()
def test_none_comparison(self):
sess = create_session()
+ # scalar
+ eq_(
+ [Order(description="order 5")],
+ sess.query(Order).filter(Order.address_id==None).all()
+ )
+ eq_(
+ [Order(description="order 5")],
+ sess.query(Order).filter(Order.address_id==null()).all()
+ )
+
# o2o
eq_([Address(id=1), Address(id=3), Address(id=4)],
sess.query(Address).filter(Address.dingaling==None).order_by(Address.id).all())
+ eq_([Address(id=1), Address(id=3), Address(id=4)],
+ sess.query(Address).filter(Address.dingaling==null()).order_by(Address.id).all())
eq_([Address(id=2), Address(id=5)], sess.query(Address).filter(Address.dingaling != None).order_by(Address.id).all())
+ eq_([Address(id=2), Address(id=5)], sess.query(Address).filter(Address.dingaling != null()).order_by(Address.id).all())
# m2o
eq_([Order(id=5)], sess.query(Order).filter(Order.address==None).all())