web2py查询表达式是如何工作的?

5
我最近有机会了解了web2py框架,虽然我之前有使用Django和Python的经验,但我对web2py所采用的查询系统感到困惑。
让我们以web2py book中的一个例子为例。
db = DAL('sqlite://storage.db')
myquery = (db.mytable.myfield > 'A')
myset = db(myquery)
rows = myset.select()
for row in rows:
    print row.myfield

在一个SO评论中,web2py的作者说(db.mytable.myfield > 'A')不能直接评估为True/False,实际上是在选择时针对每一行进行评估。我理解这就是允许将这些表达式用作查询对象甚至组合使用的原因。

我试图在网上找到答案,但没有找到,所以我的问题是:为什么这些查询表达式不会立即评估为True/False?为什么myquery的值不是True呢?我可能缺少哪些Python特性使其能够工作?

3个回答

7
其他答案已经给出了答案,但是为了提供更多与web2py相关的细节:

其他答案已经给出了答案,但是为了提供更多与web2py相关的细节:
db.mytable.myfield > 'A'

db.mytable.myfield是web2py DAL Field类的一个实例,该类继承自DAL Expression类。 Expression 类本身重载了许多Python运算符,例如==, <, >等。当应用于Expression(因此也适用于Field)对象时,这些重载的运算符不会返回标准 Python布尔对象,而是返回 DAL Query类的一个实例。这里是> (__gt__) 运算符的源代码

有关Python中运算符重载的详细信息,请参阅此处


2
任何应用于自定义(非内置)对象的操作都基于评估特殊方法。它被广泛称为运算符重载。 因此,基本上字段类定义看起来像这样:
class DBField(...):
#...

   def __gt__(self,value):
      #building query object, based on value
      return query

2

链路断开。 - Pacerier
@Scoot,Gluon到底是什么? - Pacerier
gluon是web2py代码的包名称。这里有一个更加当前的链接:https://web2py.readthedocs.io/en/latest/_modules/index.html - Scott Hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接