3.7. Rows

Rowsはレコードセットのクラスです。レコードセットの出力に関するメソッドを幾つか持っています。

参考: Set Rows Row クラスについて

Rowsクラス — レコードセットに関するクラス

first()

最初のレコードを取得

last()

最後のレコードを取得

as_dict()

辞書型に変換

as_list()

リスト型に変換

as_trees()

木構造のデータをリスト型に変換

find()

レコードセット内検索

exclude()

レコードセットの切り抜き

sort()

レコードセットのソート

setvirtualfields()

仮想フィールドの設定

export_to_csv_file()

CSVファイルへのエクスポート

xml()

xml/htmlに変換

json()

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

参考: first and lastfirst and last(日本語)

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です。

参考: as_dict and as_listas_dict and as_list(日本語)

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インスタンスです。

参考: find, exclude, sortfind, exclude, sort(日本語)

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で囲まない

参考: Python ライブラリリファレンス - 12.20 csv - 12.20.1 モジュールの内容

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/XMLHTML/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型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。