3.5. Expression¶
Expressionは式のクラスです。メソッドのパラメータ式などで利用します。
またメソッドには、Queryインスタンス(条件式)を生成するもの、データ操作を行うものがあります。 これらのメソッドは主に、Expressionクラスの継承クラスである Field を使って利用します。
参考: Expressions | 式
Expressionクラス — 式に関するクラス | |
---|---|
あいまい検索 | |
前方一致検索 | |
後方一致検索 | |
部分一致検索 | |
IN演算子 | |
正規表現による検索 | |
合計値計算 | |
平均値計算 | |
最大値の取得 | |
最小値の取得 | |
長さの取得 | |
絶対値取得 | |
NULL値の変換 | |
NULL値のゼロ変換 | |
大文字変換 | |
小文字変換 | |
日付時間の要素抜き出し | |
3.5.1. インスタンス化¶
Field インスタンスを使って式を作成すると、Expressionインスタンスになります [1] 。
【 Expressionインスタンスの生成 】
- 生成・・・・・・ Fieldインスタンスを使用して式を書きます。
>>> e = db.item.unit_cost * 1.1
update()
メソッドのパラメータとしてExpressionインスタンスを利用するサンプルです。
>>> e = db.item.unit_cost * 1.1 # unit_cost を1.1倍にする式 >>> db(db.item.id==1).update(unit_cost = e) # Expressionインスタンスをフィールド値として指定 1Note
サンプルでは数値演算を行っていますが、同じように 文字列 演算を指定した Expressionインスタンスを利用しても上手くは 動きません。これは定義した式がSQL文に変換され、データベース更新をかけるからです。 例えば、Pythonでは文字列結合に + 演算子を使用しますが、データベースによっては + 演算子では文字列結合ができません。
3.5.2. メソッド(条件式)¶
条件式として利用できるメソッドがあります。これらのメソッドはExpressionのインスタンスと、継承クラスである Field のインスタンスで使用可能です。
参考: like, startswith, contains, upper, lower | like, startswith,contains,upper, lower (日本語)
メソッド説明用のサンプルでは次のテーブルを利用します。
db.define_table('person', Field('name'), Field('birthday', 'datetime'), format='%(name)s') db.define_table('dog', Field('owner_id', db.person), Field('name'))
-
Expression.
like
(value) → Queryインスタンス¶ フィールド値の文字列をあいまい検索します。 Field インスタンスからlikeメソッドを呼びます。
>>> print db(db.person.name.like('PA%')).select() person.id,person.name 3,Pamadapa
- value
- 検索文字列を設定します。検索文字列中のパーセント記号(%)はワイルドカードとして機能します。
- 戻り値
- Queryインスタンスを返します。
-
Expression.
startswith
(value) → Queryインスタンス¶ like()
のショットカットです。先頭文字列を検索します(前方一致検索)。>>> print db(db.person.name.startswith('PA')).select() person.id,person.name 3,Pamadapa
like を使用したサンプルと同等の構文
>>> print db(db.person.name.like('PA%')).select()
- value
- 検索文字列を設定します。
- 戻り値
- Queryインスタンスを返します。
-
Expression.
endswith
(value) → Queryインスタンス¶ like()
のショットカットです。後方文字列を検索します(後方一致検索)。>>> print db(db.person.name.endswith('SA')).select() person.id,person.name 5,Sasodusa
like を使用したサンプルと同等の構文
>>> print db(db.person.name.like('%SA')).select()
- value
- 検索文字列を設定します。
- 戻り値
- Queryインスタンスを返します。
-
Expression.
contains
(value[, all]) → Queryインスタンス¶ like()
のショットカットです。途中に含まれる文字列を検索します(部分一致検索)。>>> print db(db.person.name.contains('PA')).select() person.id,person.name 1,Sapopadu 3,Pamadapa 7,Ducepapa
like を使用したサンプルと同等の構文
>>> print db(db.person.name.like('%PA%')).select()
- value
- 検索文字列を設定します。検索文字列はリスト値もしくはタプル値でも指定できます。
- all
valueがリスト値もしくはタプル値の場合、有効なパラメータです。ANDもしくはORを有効にします。 デフォルトは False です。Falseの場合、OR条件になります。Trueでは、AND条件になります。
>>> print db(db.person.name.contains(['OC','CE'])).select() person.id,person.name 1,Socopato 4,Cecemosa 5,Cecopadu 6,Cedumoco 7,Ceduduco >>> print db(db.person.name.contains(['OC','CE'],all=True)).select() person.id,person.name 6,Cedumoco
- 戻り値
- Queryインスタンスを返します。
- 注意点
containsメソッドはリストフィールドに対しては特殊な動きをします。 文字列の部分一致を検索するのではなく、listフィールドに含まれる個々の値の検索を行います。 このサンプルは リストフィールドを使用した多対多 を参照ください。
-
Expression.
belongs
(value) → Queryインスタンス¶ - フィールド値が指定したタプルの値に一致しているものを検索します。SQLのIN演算子と同様の動きをします。この機能は Google AppEngine(GAE)でもは動作しますが、Datastoreの制約上、valueに設定できる値は30個までです。
>>> print db(db.person.id.belongs((1,3,4))).select() person.id,person.name 1,Sapopadu 3,Pamadapa 4,Dumatata
- value
検索用のタプルもしくはリスト値を設定します。
valueをクエリ式にすることも可能です。この場合は入れ子(ネスト)になります。クエリ式を設定する場合はselect()
メソッドにアンダーバ(_)を付けて _select に変更します。>>> set = db(db.person.name.like('D%')).\ >>> _select(db.person.name) # personからnameの先頭文字がDのデータを抜き出す >>> print db(db.dog.name.belongs(set)).select() # dogのnameと一致するデータを抜き出す dog.id,dog.owner_id,dog.name 34,9,Dumatata
GAEではクエリ式で指定した場合、エラーになります。代わりにvalueに設定する値を検索後、リスト内包表記などで設定します。
_selectはSQL文を生成します。set変数は次のようになります。
>>> print set SELECT person.name FROM person WHERE (person.name LIKE 'D%');
SQL文の生成 も参照ください。
- 戻り値
- Queryインスタンスを返します。
-
Expression.
regexp
(value) → Queryインスタンス¶ 正規表現を使用し検索を行います。このメソッドはデータベースが、PostgreSQL及びSQLiteの場合だけ使用可能です。
>>> print db(db.person.name.regexp('^[ABCDE].*')).select() person.id,person.name 1,Deborah Kludt 9,Blanche Semmler 10,Britt Krugh 12,Elizabeth Shelpman
先頭文字が、ABCDEの何れかの文字で始まる名前のレコードを検索します。
- value
- 正規表現の文字列を設定します。
- 戻り値
- Queryインスタンスを返します。
3.5.3. メソッド(データ操作)¶
データ操作を行えるメソッドがあります。これらのメソッドはExpressionのインスタンスと、継承クラスである Field の インスタンスで使用可能です。
参考: like, startswith, contains, upper, lower | like, startswith,contains,upper, lower (日本語)
-
Expression.
sum
() → Expressionインスタンス¶ 自分自身を合計します。SQLのSUM関数に変換されます。
>>> age = (db.person.birthday.year() * -1 + datetime.datetime.today().year).sum() >>> print db().select(age).first()[age] 16
年齢の合計を計算します。age変数の式が変なのは、Expressionクラスでオーバロードされている四則演算子を動作させるためには、Expressionインスタンスもしくは 派生系のFieldインスタンスに対する演算で表現する必要があるからです。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
avg
() → Expressionインスタンス¶ 自分自身の平均を計算します。SQLのAVG関数に変換されます。
>>> age = (db.person.birthday.year() * -1 + datetime.datetime.today().year).avg() >>> print db().select(age).first()[age] 5
年齢の平均値を取得します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
max
() → Expressionインスタンス¶ 自分自身の最大値を返します。SQLのMAX関数に変換されます。
>>> age = (db.person.birthday.year() * -1 + datetime.datetime.today().year).max() >>> print db().select(age).first()[age] 6
年齢の最大値を取得します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
min
() → Expressionインスタンス¶ 自分自身の最小値を返します。SQLのMIN関数に変換されます。
>>> age = (db.person.birthday.year() * -1 + datetime.datetime.today().year).min() >>> print db().select(age).first()[age] 5
年齢の最小値を取得します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
len
() → Expressionインスタンス¶ 自分自身の長さを返します。SQLのLENGTH関数に変換されます。
>>> name = db.person.name.len().max() >>> print db().select(name).first()[name] 8
名前の長さで最大のものを取得します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
abs
() → Expressionインスタンス¶ 自分自身の絶対値を返します。SQLのABS関数に変換されます。
>>> age = (db.person.birthday.year() - datetime.datetime.today().year).abs() >>> print db().select(age) "ABS((web2py_extract('year',person.birthday) - 2013))" 5 5 6
誕生年から現在の年を引いた絶対値を取得します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
coalesce
(*others) → Expressionインスタンス¶ 自分自身がNULLの場合、NULL以外のパラメータ値を返します。SQLのCOALESCE関数に変換されます。
>>> print db(db.person.id==db.dog.owner_id).select(db.dog.name.coalesce(db.person.name)) "COALESCE(dog.name,person.name)" Comoceta Soducomo Cosasamo Pacedada
dogテーブルのnameフィールドがNULLだった場合、personテーブルのnameフィールドを代替表示します。
>>> print db(db.person.id==db.dog.owner_id).select(db.dog.name.coalesce("'----'")) "COALESCE(dog.name,'----')" Comoceta Soducomo Cosasamo ----
dogテーブルのnameフィールドがNULLだった場合、—- を代替表示します。
- others
NULLの時に代替するフィールドや固定値を指定します。文字列を指定する場合、一重引用符(‘)や二重引用符(“)で2重に囲む必要があります。
このパラメータは複数の指定が可能です。複数指定した場合、順番にNULL値かどうかを判定し、最初にNULLでないパラメータを返します。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
coalesce_zero
() → Expressionインスタンス¶ 自分自身がNULLの場合、0を返します。この機能は .coalesce(0) と同等です。
>>> print db(db.person).select(db.person.name, db.person.birthday.day().coa person.name,"COALESCE(web2py_extract('day',person.birthday),0)" Pacedada,23 Socepopa,29 Cosotama,11 test,0
birthday.day() がNULLだった場合、0を代替表示します(4行目)。
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
upper
() → Expressionインスタンス¶ 式やフィールド値の文字列を大文字に変換します。
>>> print db(db.person).select(db.person.name.upper()) UPPER(person.name) SAPOPADU PODATOSO PAMADAPA
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
lower
() → Expressionインスタンス¶ 式やフィールド値の文字列を小文字に変換します。
>>> print db(db.person).select(db.person.name.lower()) LOWER(person.name) sapopadu podatoso pamadapa
- 戻り値
- Expressionインスタンスを返します。
-
Expression.
year
() → Expressionインスタンス¶
-
Expression.
month
() → Expressionインスタンス¶
-
Expression.
day
() → Expressionインスタンス¶
-
Expression.
hour
() → Expressionインスタンス¶
-
Expression.
minutes
() → Expressionインスタンス¶
-
Expression.
seconds
() → Expressionインスタンス¶ 日時フィールドを年・月・日・時間・分・秒 の各値に変換します。
>>> print db(db.person).select(db.person.birthday.day()) "web2py_extract('day',person.birthday)" 23 29 11
>>> print db(db.person.birthday.year()==2008).select() person.id,person.name,person.birthday 1,Deborah Kludt,2008-10-23 00:00:00 2,Margarite Coonradt,2008-07-30 00:00:00
- 戻り値
- Expressionインスタンスを返します。
参考: year, month, day, hour, minutes, seconds | year, month, day, hour, minutes, seconds (日本語)
[1] | Pythonのinstance型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。 |