文書操作
1.7.
コンテンツをリレーショナルデータベースへ保存する
一つ上に移動
コンテンツタイプを保存するためには、リレーショナルデータベースをセットアップし、Zopeからコネクションを張ります
コンテンツタイプを保存するためには、リレーショナルデータベースをセットアップし、Zopeからコネクションを張ります。ここでは普段利用してい るPostgresを使った場合を考えてみます。Postgresはあらゆるレベルのユーザにとって利益をもたらしてくれます。Zopeを Postgresに接続するためにはpsycopgやZPsycopgを利用できますが、psycopgを使うのがよいでしょう。 http://initd.org/software/psycopgにはDebianパッケージやWindowsパッケージを見つけることができます。
データベースアダプタをインストールし、Zopeからリレーショナルデータベースへコネクションを張りましょう。この点については http://zope.org/Documentation/Books/ZopeBook/2_6Edition /RelationalDatabases.stxを参照してください。簡単に説明すると、ZMIへいって、ドロップダウンメニューからデータベースコネ クションを追加し、リレーショナルデータベースに接続するための設定を行います。特定のユーザでリレーショナルデータベースへ接続する場合は、そのユーザ がデータベーステーブルをcreate、insert、update、deleteできる権限を持っているかどうかを確認しておいてください。 create、delete権限はデバッグ時にスキーマやオブジェクトを追加したり削除したりするのに必要です。一度開発に区切りが付いてプロダクション フェーズへ入ったならばこれは必要ありません。
次にZMIにてarchetypes_toolをクリックし、Connectionsを選択します。ここでコンテンツタイプとデータベースアダプタ のタイプをマッピングします。一番簡単なのはデフォルトをデータベース接続にマッピングすることです。お望みなら異なるデータベースへ特定のタイプをマッ ピングすることもできます。さぁここでこの新しい保存場所を利用するようにスキーマを変更しましょう。SQLStorageから適切なストレージクラスを インポートするのを忘れないでくださいね(この場合はPostgreSQLStorageをインポートする)。
リレーショナルデータベースへ保存したフィールドのstorageパラメータを設定しましょう。様々なフィールドをリレーショナルデータベースへ保 存できることに気づきましたか?すべてのフィールドをリレーショナルデータベースへ保存することも可能ですし、いくつかのフィールドだけをリレーショナル データベースへ保存することもできますが、少なくともIDを持っているオブジェクトはPloneのデータベースへ保存するのがよいでしょう。下記の例では integer(age)、string(email)というPostgresに保存しています。
from Products.Archetypes.public import BaseSchema, Schema
from Products.Archetypes.public import BaseContent, registerType
from Products.Archetypes.public import IntegerField, StringField
from Products.Archetypes.public import IntegerWidget, StringWidget
from Products.Archetypes.SQLStorage import PostgreSQLStorage
from config import PROJECTNAME
schema = BaseSchema + Schema((
IntegerField('age',
validators=("isInt",),
storage = PostgreSQLStorage(),
widget=IntegerWidget(label="Your age"),
),
StringField('email',
validators = ("isEmail",),
index = "TextIndex",
storage = PostgresSQLStorage(),
widget = StringWidget(label='Email',)
),
))
class PersonSQL(BaseContent):
"""Our person object"""
schema = schema
registerType(PersonSQL, PROJECTNAME)
最後にPloneをリスタートし、コンテンツタイプをPloneへ登録しましょう。これでこのコンテンツタイプをテストする準備ができました。 PersonSQLオブジェクトを生成すると、いつも通りにコンテンツタイプは処理されるでしょう。もちろん実際のテストはデータベースを見てみればわか ります。
データベースの中にpersonsqlというテーブルができていることがわかるでしょう。またそのテーブルの中にはuid、parentuid、age、emailといったカラムができています。psqlを使うと以下のようになります。
db=# \d List of relations Schema | Name | Type | Owner --------+--------------------------+----------+------- public | personsql | table | www-data ... db=# \d personsql Table "public.personsql" Column | Type | Modifiers -----------+------+----------- uid | text | not null parentuid | text | age | int | email | text | Indexes: personsql_pkey primary key btree (uid)
ageカラムはint型でできていますし、emailカラムはテキスト型でできています。これらはSQLStorageの中で生成されたマッピング ですが、好きなように適切なものへと変更することができます。uidカラムはPlone内でのオブジェクトのユニークIDです。またparentuidは 親オブジェクトのuidです。これらはすべてArchetypesに対するユニークIDです。例えば:
db=# SELECT * FROM personsql; uid | parentuid | age | email ---------------------------+-----------+-----+------------------- PersonSQL.2003-07-23.4935 | | 30 | andy@clearwind.caデータがリレーショナルデータベースへ保存されたことがわかります。SQLを書く必要が全くないにもかかわらず、リレーショナルデータベースの利点 を使うことができます!Joel BurtonがSQLStorageに関するすばらしい記事を書いており(http://plone.sourceforge.net /archetypes/sqlstorage-howto.html)、彼の好意から、この章のいくつかの部分はJoelのドキュメントに基づいていま す。

