Mar*_*aev 15 python boolean sqlalchemy
我有一个通过SQLAlchemy创建的数据库"新闻":
class News(Base):
__tablename__ = "news"
id = Column(Integer, primary_key = True)
title = Column(String)
author = Column(String)
url = Column(String)
comments = Column(Integer)
points = Column(Integer)
label = Column(String)
Run Code Online (Sandbox Code Playgroud)
我还有一个函数News,它获取一个字符串并返回3个字符串变体之一:'good','maybe'或'never'.我尝试过滤行:
rows = s.query(News).filter(News.label == None and f(News.title) == 'good').all()
Run Code Online (Sandbox Code Playgroud)
但是程序失败了,引发了这个错误:
raise TypeError("Boolean value of this clause is not defined")
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
Ilj*_*ilä 28
问题是这样的:
News.label == None and f(News.title) == 'good'
# ^^^ here
Run Code Online (Sandbox Code Playgroud)
Python没有允许覆盖布尔的行为操作 and和or.您可以__bool__在Python 3和__nonzero__Python 2中对它们进行某种程度的影响,但所有这一切都是它定义了对象的真值.
如果有问题的对象没有执行__bool__,并抛出的错误,或执行没有抛出,你就已经得到了可能是非常模糊的错误由于发生短路性质and和or:
In [19]: (News.label == 'asdf') and True
Out[19]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7f62c416fa58>
In [24]: (News.label == 'asdf') or True
Out[24]: True
Run Code Online (Sandbox Code Playgroud)
因为
In [26]: bool(News.label == 'asdf')
Out[26]: False
Run Code Online (Sandbox Code Playgroud)
这可能并且会以不正确的SQL表达式的形式导致头发拉动:
In [28]: print(News.label == 'asdf' or News.author == 'NOT WHAT YOU EXPECTED')
news.author = :author_1
Run Code Online (Sandbox Code Playgroud)
为了产生布尔SQL表达式要么使用and_(),or_()和not_()SQL表达式的功能,或二进制&,|和~操作者重载:
# Parentheses required due to operator precedence
filter((News.label == None) & (f(News.title) == 'good'))
Run Code Online (Sandbox Code Playgroud)
要么
filter(and_(News.label == None, f(News.title) == 'good'))
Run Code Online (Sandbox Code Playgroud)
或将多个标准传递给Query.filter():
filter(News.label == None, f(News.title) == 'good')
Run Code Online (Sandbox Code Playgroud)
或组合多个电话filter():
filter(News.label == None).filter(f(News.title) == 'good')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8449 次 |
| 最近记录: |