| revision-up-to: | 11321 (1.1) |
|---|
アプリケーションを最初にセットアップするときに、データベースにハードコード されたデータを投入できると便利なことがあります。 Django に自動的に初期デー タを投入させる方法は二つあります: ひとつは フィクスチャによる初期データの 投入 で、もう一つは SQL による初 期データの投入 です。
フィクスチャ (fixture) とは、 Django のデータベースに投入できるよう準備済み のデータの集まりです。すでにデータの入ったデータベースを持っているなら、フィ クスチャの生成には manage.py dumpdata コマンドを使うのが一番簡単 です。フィクスチャは手でも書けます。フィクスチャは XML, YAML または JSON ド キュメント形式で書けます。サポートされている シリアライゼーションフォーマット の詳細は シリアライゼーションのドキュメント を参照して ください。
とはいえ、一例として、 JSON で書かれた Person モデルのフィクスチャを示 しておきます:
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon",
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney",
}
},
]
YAML で書くと以下のようになります:
- model: myapp.person
pk: 1
fields:
first_name: John
last_name: Lennon
- model: myapp.person
pk: 2
fields:
first_name: Paul
last_name: McCartney
フィクスチャデータはアプリケーションの fixture ディレクトリに保存します。
データのロードは簡単で、単に manage.py loaddata fixturename を実行するだけです。 fixturename はフィクスチャファイルの名前 です。 loaddata を実行するたびに、フィクスチャデータが読み出され、 データベースにリロードされます。つまり、フィクスチャによって生成されたレコー ド行を変更して loaddata を再度実行すると、変更後のデータは消去さ れてしまうのです。注意してください。
initial_data.[xml/yml/json] という名前のフィクスチャを作成しておくと、 syncdb を実行するたびに自動的にロードされます。この機能はとても 便利なのですが、一つだけ注意が必要です。というのも、 syncdb を実行するたびに 毎回 データがリフレッシュされるからです。ですから、 変更する予定のデータに initial_data を使ってはなりません。
参考
フィクスチャは テストフレームワーク で 一貫したテスト環境を構築するためにも使われています。
Django には、データベースに任意の SQL を渡すためのフックがあります。 この SQL は、 syncdb を実行した時に CREATE TABLE 文の直後に実行されま す。このフックを使えば、自動的にデフォルトのレコードをテーブルに追加したり、 SQL関数やビュー、トリガなどを作成したりできます。
フックのからくりは単純です: Django はアプリケーション内の sql/<modelname>.sql という名前のファイルを探し、実行するだけです。 <modelname> は、モデル名を小文字にした文字列です。
このドキュメントの冒頭にある Person の例で、モデルが myapp の下に置 かれていたとすると、 myapp/sql/person.sql というファイルに任意の SQL 文 を指定できます。例えば以下のような命令を入れられます:
INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');
各 SQL ファイルには、必要なデータを INSERT するための有効な SQL 文を (すなわち、正しくフォーマットされた INSERT 文をセミコロンで区切って) 入 れておかねばなりません。
SQL ファイルは manage.py の sqlcustom sqlreset, sqlall および reset コマンドの実 行時に参照されます。詳しくは manage.py のドキュメント を参照してください。
複数の SQL データファイルがある場合、個々のファイルを実行する順番は保証され ていないので注意して下さい。仮定していてよいのは、カスタムの SQL データファ イルを実行する前に、必ずデータベーステーブルは作成されているということだけ です。
バックエンド特有の SQL データに対するフックもあります。例えば、 PostgreSQL と MySQL 向けに別々の初期データを用意できます。各アプリケーションごとに Django は <appname>/sql/<modelname>.<backend>.sql というファイルを探し ます。 <appname> はアプリケーションディレクトリの名前、 <modelname> はモデル名を小文字にした文字列、 <backend> は設定ファイルの DATABASE_ENGINE に指定するバックエンドの名前 (postgresql, mysql など) です。
バックエンド固有の SQL データは、バックエンド非固有の SQL データよりも前に 実行されます。例えば、アプリケーション中に sql/person.sql および sql/person.postgresql.sql が入っていて、 PostgreSQL をバックエンドにし てインストールを行った場合、 Django はまず sql/person.postgresql.sql の 内容を実行してから sql/person.sql を実行します。
Aug 19, 2010