为什么peewee没有正确嵌套这个WHERE子句?

时间:2015-11-24 23:42:42

标签: python mysql peewee

我在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()

生成的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代码?

2 个答案:

答案 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应该能够使用管道和外部括号作为分隔符。