3.8. Row

Rowはレコードのクラスです。 Rows がレコードセットですから、Rowはレコード行になります。

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

Rowクラス — レコードに関するクラス

as_dict()

辞書型に変換

— 組み込み関数 —

update_record()

Rowと共にDB上のレコードも更新

delete_record()

Rowと共にDB上のレコードも削除

3.8.1. インスタンス化

Rowsクラスはイテレータを装備しており、Rowsインスタンスから要素を抜き出すとRowインスタンスとなります [1]

この他、Tableクラスの 特殊メソッドによるショートカット機能 から直接、Rowインスタンスを生成することも可能です。しかしこの方法は、 内部でRowsインスタンスを生成して要素を切り出しています。つまり単なるショットカット機能です。

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

  • 生成・・・・・・Rowsクラスから要素を抜き出します。
    >>> rows = db(db.person).select()
    >>> row = rows[0]               # personテーブルの先頭レコード
    
    >>> row = db.person[1]          # personテーブルの先頭レコード
    
    >>> row = db.person(1)          # personテーブルの先頭レコード
    

3.8.2. メソッド

メソッド説明用サンプルでは次のテーブルを利用します。

db.define_table('person',
    Field('name'),
    Field('birthday', 'datetime')
Row.as_dict([datetime_to_str]) → 辞書型

Rowインスタンスを辞書型データに変換します。同様のメソッドとして、Rowsクラスの as_dict() メソッド があります。

>>> print db.person(1).as_dict()
{'name': 'Totoceco', 'id': 1, 'birthday': datetime.date(2008, 12, 23)}
datetime_to_str

日付時間フィールドの文字列変換の制御を行います。デフォルトはFalseです。

>>> print db.person(1).as_dict(datetime_to_str=True)
{'name': 'Totoceco', 'id': 1, 'birthday': '2008-12-23 00:00:00'}

3.8.3. 組み込み関数

Rowインスタンスには、特殊な無名関数(lambda)が含まれています。Rowインスタンスの生成時、正確にはSetクラスの select() メソッドが動作する時にRowインスタンスに埋め込まれます。

この関数はメソッドではありません。しかし辞書型データの特徴をうまく利用して、メソッドのように動作します。

Row.update_record()

Rowインスタンスのデータと共に、データベース上のデータも更新します。

>>> row = db.person(1)
>>> row.update_record(name='Socepopa')

Rowインスタンスのデータをステップ・バイ・ステップで修正し、データベースに一度で反映させることも可能です。

>>> row = db.person(1)
>>> row.name = 'Socepopa'
>>> row.birthday = datetime.datetime(2008, 12, 23, 0, 0)
>>> row.update_record()

この場合、update_record のパラメータは指定しません。

Rowクラスにはupdateメソッドがありますが、これはPythonの辞書型でもともと用意しているメソッドです。

>>> row.update(name='Socepopa')

当然ですが、このメソッドはRowインスタンスのデータは変更しても、データベース上のデータは変更できません。

Note

update_record が動作するのは、select() にidフィールドが含まれており、cacheableオプションが True でない場合です。

参考: update_recordupdate_record(日本語)

Row.delete_record() → 削除レコード数

Rowインスタンスの、主キー値と一致するデータベースのレコードを削除します。戻り値は削除レコード数です。

>>> row.delete_record()
1

delete_record はRowもしくはRowsインスタンスの該当レコードデータは削除しません。このため必要に応じて、データベースから 読み直すなどの処理が必要です。


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