2.8. UUIDを使ったidの管理¶
web2pyでは単一システムでの idのユニーク性は保証されています。しかし分散システムでは、システム同士が連携を取る仕組み がないのであれば、当然ユニーク性は保証されません。しかし統制がない分散システム上でも、id のユニーク性を確保する方法 があります。それが UUID を使ったid管理です。
UUIDはサーバ毎に重複しないユニークな番号を生成します。UUIDは参考ページで簡単に説明しています。
参考: UUIDとは
web2py にてUUIDを使ってidを管理する場合、次のようにモデルを変更します。
元のモデル
db.define_table('person', Field('name'),format='%(name)s') db.define_table('dog', Field('owner_id', db.person), Field('name'))UUIDを利用したモデル
import uuid db.define_table('person', Field('uuid', length=64, default=lambda:str(uuid.uuid4())), Field('name'), format='%(name)s') db.define_table('dog', Field('uuid', length=64, default=lambda:str(uuid.uuid4())), Field('owner_id', length=64), Field('name')) db.dog.owner_id.requires = IS_IN_DB(db,'person.uuid','%(name)s')テーブルには、idフィールド以外にUUIDのフィールドを追加します。他のテーブルへの参照用フィールド(サンプルでは owner_id)は、 UUIDフィールドと同じ長さに変更します。
UUIDを使ったモデルに対する、レコードの挿入サンプルを示します。
id = uuid.uuid4() db.person.insert(name='Comoceta', uuid=id) db.dog.insert(owner_id=id, name='Soducomo')
他のテーブルへの参照用フィールドは値が自動設定されないため、バリデータの設置やプログラムを使って制御する必要があります。
データ読み出しに関しても 再帰的select は利用できないため、 テーブル結合(join) やプログラムでの読み出しを行う 必要があります。
詳細は参考ページにサンプルも含めて書かれています。参照ください。
参考: CSV and Remote Database Synchronization | CSVとリモート・データベースの同期