热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonSQLAlchemy:探讨Null比较的可交换性问题及其解决方案

在使用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


推荐阅读
author-avatar
xiaolizi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有