3.4. Query¶
Queryは条件式のクラスです。 Set クラスの条件式として利用できます。
参考: Logical Operators | 論理演算子
Queryクラス — 条件式に関するクラス | |
---|---|
SQLのCASE式による置換 | |
クエリ式を辞書値に変換 | |
クエリ式をjsonに変換 | |
クエリ式を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型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。 |