我打算在SQLAlchemy网站上记录一个问题,但在我做之前我只是想检查一下我没有错过任何东西。我曾询问过IRC,我认为这可能是一个合法的问题。
它归结为!=过滤器没有考虑空/ NULL单元格。
所以,比方说吧
Session.query(Table).\
filter(Table.column != 1).all()
现在我希望这会返回值不等于1的所有记录。但是,它实际返回的是包含数据的记录列表,不等于1.
因此,如果例如column是一个NULL /空值,那么我(和其他人)期望它不会被这个查询返回。
现在显然最好在创建列时使用NOT NULL,但我只想查看是否有修复此问题,或者是否值得提交错误
答案 0 :(得分:0)
嗯,这与SQLAlchemy无关,它只是NULL滚动的方式。 NULL != 1
既不是true也不是false,它的计算结果为NULL。因此,WHERE子句不会返回任何具有NULL值的行。
你可以选择:
Session.query(Table).filter(or_(
Table.column == None,
Table.column != 1,
))
或类似的东西:
Session.query(Table).filter(
func.coalesce(Table.column, -1) != 1)
将NULL值转换为可用于比较的值,因为-1 != 1
的计算结果为true。