3.4. Query

Queryは条件式のクラスです。 Set クラスの条件式として利用できます。

参考: Logical Operators論理演算子

Queryクラス — 条件式に関するクラス

case()

SQLのCASE式による置換

as_dict()

クエリ式を辞書値に変換

as_json()

クエリ式をjsonに変換

as_xml()

クエリ式をxmlに変換

3.4.1. インスタンス化

Field インスタンスを使って条件式を書くと、Queryインスタンスになります。つまりQueryインスタンスはクエリ条件式です [1]

【 Queryインスタンスの生成 】

  • 生成・・・・・・ Fieldインスタンスを使用して条件式を書きます。
    >>> query = db.person.id == 1
    

生成したQueryインスタンスを、Setクラスのパラメータとして利用したサンプルです。

>>> query = ~(db.person.name == 'Socepopa') & (db.person.id <= 3)
>>> rows = db(query).select()   # Setクラス呼び出しのパラメータとして、Queryインスタンスを指定
>>> for row in rows:
...     print row.id, row.name
1 Pacedada
3 Cosotama

3.4.2. 論理演算子

Queryインスタンスの定義では、 and , or などの演算子を利用できません。しかし次のような演算子記号が使用可能です。

and -> &
or -> |
not -> ~

サンプルは次のようになります。

query = (db.person.name != 'Todamopa') & (db.person.id < 5)
                                                        # name が Todamopa で id が5より小さい

query = (db.person.name == 'Todamopa') | (db.person.name == 'Daceduce')
                                                        # name が Todamopa もしくは Daceduce

query = ~(db.person.name == 'Todamopa') & (db.person.id < 5)
                                                        # name が Todamopa でなく id が5より小さい

Queryクラスの機能ではなく Set クラスの機能ですが、Setインスタンスを複数回コールすると and 条件に設定されます。詳細は 関数へのエミュレーション を参照ください。

db(db.person.name != 'Todamopa')(db.person.id < 5).select()

3.4.3. メソッド

Query.case([t=1, f=0]) → Expressionインスタンス

SQLのCASE式と同等の機能です。 Queryオブジェクトの結果がTrueの場合はtパラメータの値を、そうでない場合はfパラメータ値に置換します。

>>> print db().select(db.person.name, (db.person.id==2).case('(Y)', '(N)'))
person.name,(CASE WHEN (person.id = 2) THEN '(Y)' ELSE '(N)' END)
Syble Zee,(N)
Nathanial Azzano,(Y)
Loreen Depierre,(N)

person.idが2の場合は ‘(Y)’ を、そうでない場合は ‘(N)’ を表示します。
>>> print db().select(db.person.name, db.person.name.contains('A').case('(Y)', '(N)'))
person.name,"(CASE WHEN (person.name LIKE (('%' || (REPLACE('A','%','%%')) || '%'))) THEN '(Y)' ELSE '(N)' END)"
Syble Zee,(N)
Nathanial Azzano,(Y)
Loreen Depierre,(N)

person.nameフィールドに ‘A’ が含まれる場合は ‘(Y)’ を、含まれない場合は ‘(N)’ を表示します。
t
QueryがTrueの場合の値を指定します。
f
QueryがFalseの場合の値を指定します。
戻り値
Expressionインスタンスを返します。
Query.as_dict([flat=False, sanitize=True]) → 辞書型

クエリ式を辞書値に変換します。json/xml サービスで使用することができます。

>>> q = db.auth_user.id != 0
>>> q.as_dict(flat=True)
{'first': {'fieldname': 'id', 'tablename': 'auth_user'},
 'ignore_common_filters': False,
 'op': 'NE',
 'optional_args': {},
 'second': 0}
Query.as_json([sanitize=True]) → json

クエリ式をjson形式に変換します。

>>> q = db.auth_user.id != 0
>>> q.as_json()
u'{"second": 0, "ignore_common_filters": false, "optional_args": {}, "f
irst": {"fieldname": "id", "tablename": "auth_user"}, "op": "NE"}'
Query.as_xml([sanitize=True]) → xml

クエリ式をxml形式に変換します。

>>> q = db.auth_user.id != 0
>>> q.as_xml()
'<?xml version="1.0" encoding="UTF-8"?><document><second>0</second><ign
ore_common_filters>False</ignore_common_filters><optional_args></optional_args><
first><fieldname>id</fieldname><tablename>auth_user</tablename></first><op>NE</o
p></document>'



他に、 Expression クラスのメソッドにはQueryインスタンスを返すものもあります。つまり式から条件式を作り 出すことも可能です。詳細は メソッド(条件式) を参照ください。また、 QueryとExpression クラスについて についても参照ください。


[1]Pythonのinstance型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。