我在Python peewee ORM中创建了这样的查询:
myTableModel.records = myTableModel.select(
myTableModel.table_field_name
).where(
(myTableModel.second_field_name.is_null(True) |
myTableModel.second_field_name == "")
)
我可以回到运行print myTableModel.records.sql()
SELECT `t1`.`table_field_name`
FROM `table_name` AS t1
WHERE (((`t1`.`second_field_name` IS NULL) OR `t1`.`second_field_name`) = '');
这不是使用正确的嵌套。这是我想要的陈述:
SELECT `t1`.`table_field_name`
FROM `table_name` AS t1
WHERE `t1`.`second_field_name` IS NULL OR `t1`.`second_field_name` = '';
现有的WHERE
条款归结为此......
WHERE `t1`.`second_field_name` IS NULL = ''
...与我想要的完全相反,返回second_field_name
不 NULL
的所有行。
我该如何解决这个问题?我是否以某种方式错误地嵌套了Python代码?
答案 0 :(得分:1)
Peewee倾向于Python的解析器来生成表达式。由于Python的operator precedence,你需要在大多数比较中使用括号。这里没有魔法,只有Python。
http://docs.peewee-orm.com/en/latest/peewee/querying.html?highlight=precedence#expressions
答案 1 :(得分:-1)
通过反复试验,我发现添加两个括号可以修复查询。必须在myTableModel.second_field_name == ""
附近添加括号,如下所示:
myTableModel.records = myTableModel.select(
myTableModel.table_field_name
).where(
(myTableModel.second_field_name.is_null(True) |
(myTableModel.second_field_name == ""))
)
我不确定为什么这会有所帮助。似乎Python和peewee应该能够使用管道和外部括号作为分隔符。