作者:xiaolizi | 来源:互联网 | 2024-11-08 09:25
在使用SQLAlchemy时,笔者偶然发现了一个关于`NULL`比较的有趣现象。具体来说,当使用`Column(x).is_(null())`进行比较时,其行为与预期有所不同。本文将深入探讨这一问题,并提出相应的解决方案,以确保在处理`NULL`值时代码的可交换性和一致性。
我只是偶然发现了sqlalchemy的这种行为:
>>> from sqlalchemy import Column, null
>>> print(Column("x") == null())
x IS NULL
>>> print(Column("x") == None)
x IS NULL
>>> print(null() == Column("x"))
NULL = x
>>> print(NOne== Column("x"))
x IS NULL
有人可以解释为什么在使用None时,==对于null()是不可交换的?目的是什么?
解决方法:
首先,请查看Identity vs. Equailty,了解为什么None条件都返回x IS NULL.
null()子句返回不同结果的原因是运算符的工作方式.
根据文档,运算符的工作方式如下:
In a column context, produces the clause a = b. If the target is None, produces a IS NULL.
说明:
Column("x") == null() # a = b -> b is NullType; returning IS NULL
null() == Column('x') # a = b -> b is ColumnType; not returning IS NULL
有关更多信息,请查看Sqlalchemy Docs