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