3.7. Rows¶
Rowsはレコードセットのクラスです。レコードセットの出力に関するメソッドを幾つか持っています。
Rowsクラス — レコードセットに関するクラス | |
---|---|
最初のレコードを取得 | |
最後のレコードを取得 | |
辞書型に変換 | |
リスト型に変換 | |
木構造のデータをリスト型に変換 | |
レコードセット内検索 | |
レコードセットの切り抜き | |
レコードセットのソート | |
仮想フィールドの設定 | |
CSVファイルへのエクスポート | |
xml/htmlに変換 | |
jsonに変換 |
3.7.1. インスタンス化¶
Setクラスの select()
メソッドを呼ぶと、Rowsインスタンスを返します。これによりデータベースクエリ
が実行され、レコードセットを取得します [1] 。
【 Rowsインスタンスの生成 】
- 生成・・・・・・Setクラスの selectメソッドを呼びます。
>>> rows = db(db.person).select()
生成したRowsインスタンスを使って、データを表示するサンプルです。
>>> rows = db(db.person).select() >>> print rows person.id,person.name 1,Pacedada 2,Socepopa 3,Cosotama
3.7.2. メソッド¶
メソッド説明用サンプルでは次のテーブルを利用します。
db.define_table('person', Field('name'), format='%(name)s')
-
Rows.
first
() → Rowインスタンス¶ Rowsインスタンスに含まれる最初のレコードを返します。戻り値は Row インスタンスです。
>>> rows = db(db.person).select() >>> row = rows.first()
サンプルをリスト型で表記した場合は次のようになります。
>>> rows = db(db.person).select() >>> row = rows[0] if len(rows) > 0 else None
-
Rows.
last
() → Rowインスタンス¶ Rowsインスタンスに含まれる最後のレコードを返します。戻り値は Row インスタンスです。
>>> rows = db(db.person).select() >>> row = rows.last()
サンプルをリスト型で表記した場合は次のようになります。
>>> rows = db(db.person).select() >>> row = rows[-1] if len(rows) > 0 else None
-
Rows.
as_dict
([key, storage_to_dict, datetime_to_str]) → 辞書型¶ Rowsインスタンスを辞書型データに変換します。同様のメソッドとして、Rowクラスの
as_dict()
メソッド があります。>>> rows = db(db.person).select() >>> print rows.as_dict() {1: {'name': 'Pacedada', 'id': 1}, 2: {'name': 'Socepopa', 'id': 2}, 3: {'name': 'Cosotama', 'id': 3}}
- Key
辞書型のキーとするフィールド名を指定します。デフォルトは ‘id’ です。サンプルを key=’name’ に変更してみます。
>>> print rows.as_dict(key='name') {'Socepopa': {'name': 'Socepopa', 'id': 2}, 'Cosotama': {'name': 'Cosotama', 'id': 3}, 'Pacedada': {'name': 'Pacedada', 'id': 1}}
- storage_to_dict
辞書型データを、値のみにするか、Rowインスタンスにするかの設定をします。デフォルトはTrueです。 Falseに設定すると、データがRowインスタンスになります。
>>> print rows.as_dict(storage_to_dict=False) {1: <Row {'name': 'Pacedada', 'update_record': <function <lambda> at 0x036CD430> , 'dog': <gluon.dal.Set object at 0x036CFF90>, 'ownership': <gluon.dal.Set objec t at 0x036CFEF0>, 'mouse': <gluon.dal.Set object at 0x036CFF10>, 'id': 1, 'delet e_record': <function <lambda> at 0x036CD470>}>, ... 省略 ... }
- datetime_to_str
- 日付時間フィールドの文字列変換の制御を行います。デフォルトはTrueです。
-
Rows.
as_list
([storage_to_dict, datetime_to_str]) → リスト型¶ Rowsインスタンスをリスト型データに変換します。各レコードは辞書型になります。
>>> rows = db(db.person).select() >>> print rows.as_list() [{'name': 'Pacedada', 'id': 1}, {'name': 'Socepopa', 'id': 2}, {'name': 'Cosotama', 'id': 3}]
- storage_to_dict
辞書型データを、値のみにするか、Rowインスタンスにするかの設定をします。デフォルトはTrueです。 Falseに設定すると、データがRowインスタンスになります。
>>> print rows.as_list(storage_to_dict=False) [<Row {'name': 'Pacedada', 'update_record': <function <lambda> at 0x036CDF70>, ' dog': <gluon.dal.Set object at 0x0375E330>, 'ownership': <gluon.dal.Set object a t 0x0375E1B0>, 'mouse': <gluon.dal.Set object at 0x0375E1D0>, 'id': 1, 'delete_r ecord': <function <lambda> at 0x03759530>}>, ... 省略 ... ]
- datetime_to_str
- 日付時間フィールドの文字列変換の制御を行います。デフォルトはTrueです。
-
Rows.
as_trees
([parent_name, children_name]) → リスト型¶ 木構造のRowsインスタンスをリスト型データに変換します。各レコードは辞書型になります。 子レコードは、親レコードのchildrenに格納されます。
db.define_table('category', Field('name'), Field('parent_id', 'reference category'), format='%(name)s')
>>> print db(db.category).select() category.id,category.name,category.parent_id 1,test1,<NULL> 2,test2,1 3,test3,2 >>> print db(db.category).select().as_trees() [<Row {'name': 'test1', 'id': 1L, 'parent_id': None, 'children': [ <Row {'name': 'test2', 'id': 2L, 'parent_id': 1L, 'children': [ <Row {'name': 'test3', 'id': 3L, 'parent_id': 2L, 'children': []}>]}>]}>]
- parent_name
- 対象テーブルで使用されている、参照フィールドの名前です。デフォルトは parent_id です。
- children_name
- 生成するリストの子供データを格納する辞書キーの名前です。デフォルトは children です。
-
Rows.
find
(f) → Rowsインスタンス¶ Rowsインスタンスの検索ができます。Rowsインスタンスを検索し、条件に合致したレコードだけのRowsインスタンス を生成します。元のRowsインスタンスはそのまま維持されます。また、この機能ではデータベースアクセスは発生しません。
>>> rows = db(db.person).select() >>> print rows.find(lambda row:row.name[0]=='S') # nameフィールドの先頭文字が'S'のものを検索 person.id,person.name 2,Socepopa >>> print rows.find(lambda row:'c' in row.name) # nameフィールドに'c'を含むものを検索 person.id,person.name 1,Pacedada 2,Socepopa
- f
- 検索条件を設定します。 Row インスタンスをパラメータに持つ、ブール値を返す無名関数(lambda) で定義します。
- 戻り値
- Rowsインスタンスです。
-
Rows.
exclude
(f) → Rowsインスタンス¶ Rowsインスタンスの切り抜きができます。Rowsインスタンスを検索し、条件に合致したレコードだけのRowsインスタンス を生成します。元のRowsインスタンスから条件に合致したデータは取り除かれます。 また、この機能ではデータベースアクセスは発生しません。
>>> rows = db(db.person).select() >>> ex_rows = rows.exclude(lambda row:row.name[0]=='P') >>> print ex_rows person.id,person.name 1,Pacedada >>> print rows person.id,person.name 2,Socepopa 3,Cosotama
- f
- 検索条件を設定します。 Row インスタンスをパラメータに持つ、ブール値を返す無名関数(lambda) で定義します。
- 戻り値
- Rowsインスタンスです。
find()
とほぼ同じ機能ですが、元のRowsインスタンスを維持するか、切り抜くかの違いがあります。
-
Rows.
sort
(f[, reverse]) → Rowsインスタンス¶ Rowsインスタンスのソートができます。ソートキーを指定しますと、キーに従って並び替えたRowsインスタンスを生成します。 元のRowsインスタンスはそのまま維持されます。また、この機能ではデータベースアクセスは発生しません。
>>> rows = db(db.person).select() >>> for row in rows.sort(lambda row:row.name): ... print row.name Cosotama Pacedada Socepopa
- f
- ソートキーを設定します。 Row インスタンスをパラメータに持つ、キー値を返す無名関数(lambda) で定義します。
- reverse
正逆ソートの指定ができます。Trueだと逆ソート順になります。デフォルトはFalseです。
>>> for row in rows.sort(lambda row:row.name, reverse=True): ... print row.name Socepopa Pacedada Cosotama
- 戻り値
- Rowsインスタンスです。
-
Rows.
setvirtualfields
(**keyed_virtualfields)¶ 仮想フィールドの設定をします。詳細は setvirtualfields を参照ください。
-
Rows.
export_to_csv_file
(ofile[, null, *args, **kwargs])¶ データをCSV形式でエクスポートします。 Rows インスタンスを文字列にする場合も使われます。
サンプルは export_to_csv_file(Rowクラス) を参照ください。
- ofile
- 出力先を指定します。
- null
- Null値(PythonではNone)の場合の代替文字列を指定します。デフォルトは <NULL> です。
- **kwargs
次のオプションを指定できます。
- delimiter
- フィールド区切り記号の指定です。デフォルトは ‘,’ です。
- quotechar
- 文字列囲み記号の指定です。。デフォルトは ‘”’ です。
- quoting
文字列囲み記号をどのようにつけていくか指定します。デフォルトは QUOTE_MINIMAL です。
- QUOTE_ALL - 全フィールドをquotecharで囲む
- QUOTE_MINIMAL - delimiter記号を含んだり、quotecharで始まるフィールドだけをquotecharで囲む
- QUOTE_NONNUMERIC - 非数値フィールドだけをquotecharで囲む
- QUOTE_NONE - quotecharで囲まない
- represent
- representオプションで設定した値で出力するかどうかの指定です。Trueの場合は設定値で出力します。 デフォルトはFalseです。 represent も参照ください。
- colnames
- カラムの名前をリスト型で指定できます。デフォルト値はテーブルのフィールド名です。
-
Rows.
xml
() → xml/html形式¶ Rowsインスタンスを xml/html 形式に変換します。
>>> rows = db(db.person).select() >>> print rows.xml() <table><thead><tr><th>person.id</th><th>person.name</th></tr></thead> <tbody><tr class="even"><td>1</td><td>Pacedada</td></tr> <tr class="odd"><td>2</td><td>Socepopa</td></tr> <tr class="even"><td>3</td><td>Cosotama</td></tr></tbody></table>
xml/html への変換では、次のようにHTMLヘルパーを用いればカスタマイズができます。
>>> rows = db(db.person).select() >>> print TAG.person(*[TAG.row(*[TAG.field(row[field], _name=field)\ ... for field in db.person.fields]) for row in rows]) <person><row><field name="id">1</field><field name="name">Pacedada</field></row> <row><field name="id">2</field><field name="name">Socepopa</field></row> <row><field name="id">3</field><field name="name">Cosotama</field></row></person>
参考: HTML/XML | HTML/XML(日本語)
-
Rows.
json
([mode])¶ Rowsインスタンスを json 形式に変換します。
>>> rows = db(db.person).select() >>> print rows.json() [{"id": 1, "name": "Pacedada"}, {"id": 2, "name": "Socepopa"}, {"id": 3, "name": "Cosotama"}]
- mode
データ形式の切り替えができます。渡すことができるパラメータは object(辞書型)、array(リスト型) です。デフォルトはobjectです。
>>> print rows.json(mode='array') [[1, "Pacedada"], [2, "Socepopa"], [3, "Cosotama"]]
3.7.3. 属性¶
-
Rows.
compact
¶ フィールドの短縮名の許可・不許可を行います。デフォルトはTrueです。Trueの場合、フィールドの短縮名を許可します。 Falseはフィールドの短縮名を不許可にします。
この属性は通常は使用しません。
>>> rows = db(db.person).select() >>> # compact=True の場合 >>> rows[0].name 'Socopato' >>> rows[0]['name'] 'Socopato' >>> rows[0].person.name KeyError: 'person' >>> rows[0]['person.name'] 'Socopato' >>> # compact=Falsee の場合 >>> rows.compact=False >>> rows[0].name KeyError: 'name' >>> rows[0]['name'] KeyError: 'name' >>> rows[0].person.name 'Socopato' >>> rows[0]['person.name'] 'Socopato'
[1] | Pythonのinstance型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。 |