3.2. Field¶
Filedはデータベーステーブルのフィールドに関するクラスです。
Fieldクラスのインスタンス生成によって、フィールド定義が可能です。この他にFieldクラスは Expression クラスを継承しているため、 Fieldインスタンスと共にExpressionクラスのメソッドが使用可能です。
参考: Record Representation | レコードの表現
Fieldクラス — フィールドに関するクラス | |
---|---|
フィールド定義 | |
フィールドのカウント | |
フィールドのバリデータ表示フォーマット値 | |
フィールドのバリデータ |
3.2.1. インスタンス化¶
Fieldインスタンスの生成は、Fieldクラスのコンストラクタを使用します。また既に定義されているテーブルのフィールドの場合は、 db.テーブル名.フィールド名 でFieldインスタンスにアクセスできます [1] 。
【 Fieldインスタンスの生成とアクセス 】
生成・・・・・・ コンストラクタ を使用します。
アクセス・・・定義されているテーブルのフィールドへは db.テーブル名.フィールド名 でアクセス可能です。
>>> field = db.person.name # personテーブルのnameフィールドの Fieldインスタンス
-
class
dal.
Field
→ Fieldインスタンス¶ コンストラクタはフィールド定義を行います。
db.define_table('item', Field('name','string',length=256), Field('unit_cost','decimal(10,6)')) db.define_table('inventory', Field('item', db.item), Field('actual','decimal(10,2)'), Field('reserved','decimal(10,2)'))
Parameters: - name – フィールド名
- type – フィールド型
- length – フィール長
- default – デフォルト値
- required – 挿入時(DAL)の必須設定
- requires – SQLFORMでのバリデータ設定
- ondelete – レコード削除時の動作設定
- notnull – Null値の禁止設定
- unique – ユニーク値の設定
- widget – ウィジットの設定
- label – フィールドラベルの値
- comment – フィールドのコメント値
- writable – フォームの編集設定
- readable – フォームの表示設定
- update – 更新時のデフォルト値
- compute – 挿入・更新時の関数設定
- represent – 読み出し時の関数設定
- uploadfield – upload型でのblobフィールドの設定
- uploadseparate – upload型でのサブ・フォルダ設定
- authorize – upload型のアクセスコントロール設定
- autodelete – upload型の参照レコード削除時のファイル削除設定
Returns: Fieldインスタンス
以下パラメータの詳細な説明を行いますが、一部のパラメータはデータベース(DAL)向けではなく、SQLFORM向けだけの設定です。 このためSQLFORMの専用パラメータの名前の横には、 (SQLFORM専用) と記述するようにします。
- name
- フィールド名を文字列で指定します。
- type
次のフィールドタイプを文字列で指定できます。
string
,text
,boolean
,integer
,double
,decimal(n,m)
date
,time
,datetime
,password
,blob
,upload
reference <table>
,list:string
,list:integer
,list:reference <table>
json
,bigint
,big-id
,big-reference
decimal(n,m)
は10進数型です。nは全体の桁数、mには小数点以下の桁数を設定します。SQLiteではdobuleとして扱われます。blob
はバイナリデータを格納できます。web2pyは格納時にbase64でエンコード、取り出し時にデコードします。upload
はアップロードファイル型です。アップロードファイルはサーバのファイルシステムに保存されます。 ファイルシステムではなくBlobフィールドに保存する設定も可能です。GAEでは何も設定しなくても Datasore に保存します。
reference <table>
は他テーブルへの参照フィールド型です。次のように、referenceキーワードで指定します。Field('owner_id', 'reference person')
referenceキーワードの代わりに、Tableインスタンスを指定しても同じように動作します。
Field('owner_id', db.person)
Tableインスタンスを使った参照フィールドの設定では、 テーブルのリレーション と 自己参照型フィールドの注意点 も参照ください。
list:string
,list:integer
,list:reference <table>
これらのリストフィールドは GAE の Datastore では ListProperty や StringListProperty といったフィールドに対応しています。 RDBMS でないタイプのデータベースが持つ機能ですが、web2py ではこれらのフィールドも RDBMS に対 して利用することが可能です。 リストフィールドのデータは RDBMS では、textフィールドに ‘|’ の区切り文字で格納されます。リストフィールドを使用した多対多 も参照ください。
リストフィールドの検索は、
contains()
メソッドを使用します。list:reference <table>
はデフォルトでは次のバリデータが設定されています。IS_IN_DB(db,’<table>.id’,multiple=True)
これはフォームで複数選択可能なドロップボックを表示します。
list:string
,list:integer
デフォルトではバリデータは設定されていません( フィールドタイプ毎のデフォルト・バリデータ )。 フォームで利用する場合は、IS_IN_SET か IS_IN_DB を設定する必要があります。
json
シリアル化されたJsonオブジェクトを保管します。big-id
,big-reference
は一部のデータベースでサポートされています。DAL
コンストラクタのパラメータ bigint_id を True で指定すれば、id
reference
がbig-id
big-reference
に変更されます。
- length
string
,text
,password
,upload
の最大フィールド長を設定します。設定しない場合はデフォルト値 を使用します。しかし後方互換性は保証されないので、設定することが推奨されています。- default
- デフォルト値。レコード挿入時にフィールドに値がないと、デフォルト値を設定します。 SQLFORMでは画面上にデフォルト値を表示します。
- required
- True を設定するとフィールド値が要求されます。デフォルトは False です。 このパラメータは現在のところ、特に機能が実装されていないようです。このため、notnull パラメータを利用した方がよいでしょう。
- requires (SQLFORM専用)
バリデータもしくはバリデータのリストを設定します。この設定はSQLFORMのフィールドに対して動きます。 このオプションが無設定でも、フィールドタイプによってデフォルトで設定されるバリデータがあります( フィールドタイプ毎のデフォルト・バリデータ )。
参考: Validators | バリデータ
- ondelete
- 参照しているレコードを削除する設定です。デフォルトは CASCADE です。 CASCADE ではレコード削除時に、そのレコード を参照している全てのレコードを削除します。関連しているレコードを削除したくない場合、 NO ACTION を設定します。
- notnull
- null値を許すかどうか設定します。デフォルトはFalseです。Trueに設定すると、フィールドにnull値の挿入を禁止します。
- unique
- フィールド値のユニーク設定です。デフォルトはFalseです。Trueに設定すると、フィールド値がユニークなのを強制します。
- widget (SQLFORM専用)
- 利用可能なウィジットの設定が可能です。デフォルトはNoneです。
- label (SQLFORM専用)
- フィールドのラベルを設定します。デフォルトはNoneです。
- comment (SQLFORM専用)
- フィールドのコメントを設定します。デフォルトはNoneです。
- writable (SQLFORM専用)
- 編集可能かどうかの設定します。デフォルトはTrueです。Trueですとフォーム上で編集可能です。
- readable (SQLFORM専用)
- 表示可能かどうかの設定します。デフォルトはTrueです。Trueですとフォーム上で表示可能です。
- update
- 更新時のデフォルト値を設定できます。デフォルトはNoneです。
- compute
- 挿入・更新時の関数を設定できます。デフォルトはNoneです。詳細は compute を参照ください。
- represent
- レコード読み出し時の関数を設定できます。デフォルトはNoneです。詳細は represent を参照ください。
これ以降は
upload
フィールドに関するオプションです。- uploadfield
アップロードファイルを
blob
タイプのデータベースフィールドに格納する場合に設定します。 このオプションにblob
タイプのフィールドを指定します。詳細は参考を参照ください。 GAEではこの設定を行わなくても Datastore に格納します。- uploadfolder
ファイルを保存するフォルダを指定します。 指定しない場合、アプリケーションフォルダ下のuploadsフォルダになります。 例えば、次のように指定可能です。
uploadfolder=os.path.join(request.folder,'static/temp')
この場合、web2py/applications/アプリケーション名/static/temp フォルダにアップロードファイルが保存されます。
- uploadseparate
- アップローダファイルを保存先のサブフォルダに保存する場合に使用します。デフォルトはFalseです。 Trueにすると、アプリケーションフォルダのuploads下にサブフォルダを作成してファイルを保存します。 アプリケーションの稼働中は変更が反映されない。変更前に保存したファイルはアクセス不可能になるなど、 制約もあるようです(その場合はファイルを変更後の位置に移動させるなどが必要です)。
- uploadfs
- Amazon S3、FTPサーバ、WebDAVなどの異なるファイルシステムにアップロドすることができます。 このオプションを指定する場合、 PyFileSystem が必要です。 デフォルトはNoneです。
- authorize
upload
フィールドのアクセスコントロール用のオプションです。詳細は不明です。- autodelete
- アップロードファイルを参照するレコードを削除した場合、ファイルを削除するかどうかの設定です。 デフォルトはFalseです。Trueに設定すると削除します。
参考: Record Representation | レコードの表現
3.2.2. メソッド¶
メソッド説明用サンプルでは次のテーブルを利用します。
db.define_table('person', Field('name'), format='%(name)s') db.define_table('dog', Field('owner_id', db.person), Field('name'))
-
Field.
count
() → Expressionインスタンス¶ 自分自身を COUNT() 式中に設定する Expressionインスタンスを返します。
select()
メソッドのパラメータなどに使用します。 SQLのCOUNT関数に変換されます。>>> count = db.person.id.count() >>> for row in db(db.person.id==db.dog.owner_id).select(db.person.name, count,groupby=db.person.name): ... print row.person.name, row[count] Cosotama 1 Socepopa 2 >>> print db(db.person.id==db.dog.owner_id).select(db.person.name, db.person.id.count(), groupby=db.person.name) person.name,COUNT(person.id) Cosotama,1 Socepopa,2 >>> print db.person.id.count() COUNT(person.id)
- 戻り値
- 自分自身を COUNT() 式中に設定する Expressionインスタンスを返します。
-
Field.
formatter
(value) → 値¶ フィールドのバリデータを呼び出して、バリデータの表示フォーマットに反映した結果を返します。
db.define_table('person', Field('name'), Field('birthday', 'date', requires=IS_DATE(format='%Y/%m/%d')), format='%(name)s')
personテーブルのbirthdayフィールドに、IS_DATEバリデータの表示設定がされている場合、formatterメソッドを利用して表示フォーマットを反映させることができます。
これは通常のフォーマットでの表示です。
>>> for row in db(db.person).select(): ... print row.name, row.birthday Pocomaco 2001-12-01 Satocoto 2002-01-20 Codatada 2001-08-12
バリデータで設定されているフォーマットでの表示です。
>>> for row in db(db.person).select(): ... print row.name, db.person.birthday.formatter(row.birthday) Pocomaco 2001/12/01 Satocoto 2002/01/20 Codatada 2001/08/12
- value
- バリデータに渡す値です。
- 戻り値
- バリデータの表示フォーマットに変換した値を返します。
-
Field.
validate
(value) → タプル値¶ フィールドのバリデータを呼び出して、結果を返します。
>>> print db.person.name.validate('test') ('test', None) >>> print db.person.name.validate('a'*513) ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'enter from 0 to 512 characters')
textタイプのバリデータは512文字以内なので、エラーが返される。
- value
- バリデータする値を設定します。
- 戻り値
- バリデータした値とエラー値を
(value, error)
のタプル型で返します。エラーがない場合は、エラー値は None になります。
3.2.3. 属性¶
属性の説明には次のテーブルを使用します。
db.define_table('person',
Field('name'), format='%(name)s')
Fieldクラスに関する属性¶
web2py Book に記載されていた属性を、最初に紹介します。
-
Field.
type
¶ フィールドタイプを保持する属性です。
>>> db.person.name.type 'string'
-
Field.
unique
¶ ユニーク設定を保持する属性です。
>>> db.person.name.unique False
-
Field.
notnull
¶ null値を許すかどうかの設定を保持する属性です。
>>> db.person.name.notnull False
-
Field.
length
¶ フィールド長を保持する属性です。
>>> db.person.name.length 512
これらの属性は Fieldコンストラクタにて設定されます。Fieldコンストラクタのパラメータは、属性として参照可能です。 次に web2py Book での記述はなかったですが、代表的な属性を挙げてみます。
-
Field.
name
¶ フィールド名を保持する属性です。
-
Field.
label
¶ フィールドラベルを保持する属性です。
-
Field.
comment
¶ フィールドコメントを保持する属性です。
-
Field.
default
¶ フィールドのデフォルト値を保持する属性です。SQLFORMなどで使用されます。
この他の属性については、詳細はソースを確認するのがよいでしょう。 ソースは web2py\gluon\dal.py ファイルの Fieldクラスのコンストラクタ( __init__ )です。
Fieldクラス以外の属性¶
Fieldクラスのコンストラクタでは設定しませんが、Fieldインスタンスに含まれる属性もあります。 web2py Book では次の属性を紹介しています。
-
Field.
_table
¶ Tableインスタンスを保持する属性です。
>>> type(db.person.name._table) <class 'gluon.dal.Table'>
-
Field.
_tablename
¶ テーブル名を保持する属性です。
>>> db.person.name._tablename 'person'
-
Field.
_db
¶ DALインスタンスを保持する属性です。
>>> type(db.person.name._db) <class 'gluon.dal.DAL'>
これらの属性は Table クラスのコンストラクタで設定されています。
参考: Record Representation | レコードの表現
[1] | Pythonのinstance型オブジェクトではありませんが、簡単に説明するために インスタンス という言葉を使用しています。 |