1.3. クラス¶
DALを使うには構成するクラスを知る必要があります。これらのクラスについて説明します。
1.3.1. 主要なクラス¶
DALには非常に多くのクラスが含まれます。この中にはフレームワークを利用する上で、どうしても知っている必要があるクラスがあります。このようなクラスを次に挙げてみます。
これらのクラスとその主な機能(メソッド)を表したのが次の図になります。
|
|
|
クラスとそのクラスに属する機能(メソッド)を知るのは、DALを使いこなす上で重要な事項になります。
1.3.2. DAL構文とクラスの関係¶
次にDAL構文とクラスの関係について、サンプルコードを使って示してみます。
レコード検索と出力¶
サンプルコード
>>> rows = db(db.person.id > 0).select()
>>> for row in rows:
... print row.name
...
Potamata
Cotasata
Tamodama
サンプルとクラスの関連図
クラスをコード断片毎に、詳細に見ていきます。
コード クラス db DAL db.person Table db.person.id Field db.person.id > 0 Query db() DAL db(db.person.id > 0) Set rows = db(db.person.id > 0).select() Rows row = rows[0] Row row.name 文字列
DAL構文とクラスは密接に関係しているということが、理解できるのではないでしょうか。
1.3.3. DALとTable、Fieldクラスについて¶
コード クラス db DAL db.person Table db.person.id Field
DALとTableクラスの基底クラスは、dict(辞書)クラスです。このため次のように辞書型として各クラスにアクセス可能です、
コード クラス db DAL db[‘person’] Table db.person.[‘id’] Field db[‘person’][‘id’] Field
親となる接続やテーブルに、クラスを逆に遡ることも可能です。
Fieldクラス コード クラス db.person.id Field db.person.id._table Table db.person.id._db DAL
Tableクラス コード クラス db.person Table db.person._db DAL
コード 文字列 db.person.id._tablename ‘person’ db.person._tablename ‘person’ db.person._db ‘sqlite’ db._uri ‘sqlite://storage.sqlite’
また、DALクラスやTableクラスのオブジェクトはイテレータとして、TableオブジェクトやFieldオブジェクトを取り出すことが可能です。
>>> for t in db: ... print t ... auth_user auth_group auth_membership auth_permission auth_event auth_cas person>>> for f in db.person: ... print f ... person.id person.name
1.3.4. QueryとExpression クラスについて¶
Queryクラス
>>> qry = db.person.name == 'Potamata' # personのnameが'Potamata'とイコールという条件式
>>> type(qry)
<class 'gluon.dal.Query'>
qryはQueryインスタンスになります。
Expressionクラス
>>> exp = db.item.unit_cost * 1.1 # コスト単価を1.1倍にする式
>>> type(exp)
<class 'gluon.dal.Expression'>
expはExpressionインスタンスです。
これらのインスタンスは、他のクラスのメソッドなどの引数として使用することになります。
またExpressionクラスは、Queryクラスを返すメソッドを幾つか持っています。
サンプルコード
>>> qry = db.person.name.like('P%')
>>> type(qry)
<class 'gluon.dal.Query'>
db.person.nameはFieldクラスですが、FieldクラスはExpressionクラスを継承しています。このためExpressionクラスのメッソド like の呼び出しが可能です。likeメソッドは、あいまい検索のQueryインスタンスを返します。
詳細は、 Query , Expression を参照ください。
1.3.5. Set Rows Row クラスについて¶
Set Rows Row の各クラスは具体的に、どんなクラスなのでしょうか。この3つのクラスを説明したのが次の図です。
Setはレコードセットを定義していますが、データの実体としては何もありません。Rowsインスタンスが生成された時点で、初めてクエリを実行します。そして、データベースからデータが取り出されてメモリ上に格納します。
Rowsはメモリ上にあるレコードの塊と考えればよいです。
RowはRowsをさらに分解して、一レコード単位にしたものです。
RowsとRowのインスタンスは、既にデータベースから切り離されています。このためRows及びRowインスタンスのデータを改変しても、データベース上のデータには影響しません。
Rowsはイテレータを使用し、Rowを取り出すことができます。
サンプルコード
>>> rows = db(db.person.id > 0).select()
>>> for row in rows:
... print row.name
...
Potamata
Cotasata
Tamodama
また基底クラスが、dict(辞書)クラスではありませんが、RowsやRowは辞書型をエミュレートします。
Rowsクラス コード クラス rows = db(db.person.id > 0).select() Rows row = rows[0] Row rows[0][‘name’] 文字列
Rowクラス コード クラス row.name 文字列 row[‘name’] 文字列 row(person.name) 文字列