.. _howto-initial-data: ================================= モデルに初期データを投入する ================================= :revision-up-to: 17812 (1.4) アプリケーションを最初にセットアップするときに、データベースにハードコード されたデータを投入できると便利なことがあります。 Django に自動的に初期デー タを投入させる方法は二つあります: ひとつは `フィクスチャによる初期データの 投入 <#providing-initial-data-with-fixtures>`_ で、もう一つは `SQL による初 期データの投入 <#providing-initial-initial-sql-data>`_ です。 .. _providing-initial-data-with-fixtures: フィクスチャによる初期データの投入 ==================================== フィクスチャ (fixture) とは、 Django のデータベースに投入できるよう準備済み のデータの集まりです。すでにデータの入ったデータベースを持っているなら、フィ クスチャの生成には :djadmin:`manage.py dumpdata ` コマンドを使うのが 一番簡単です。フィクスチャは手でも書けます。フィクスチャは XML, YAML または JSON ドキュメント形式で書けます。サポートされている :ref:`シリアライゼーション フォーマット ` の詳細は :doc:`シリアライゼーションのド キュメント ` を参照してください。 とはいえ、一例として、 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 ` を実行するだけです。 ```` はフィクスチャファイルの名 前です。 :djadmin:`loaddata` を実行するたびに、フィクスチャデータが読み出さ れ、データベースにリロードされます。つまり、フィクスチャによって生成されたレ コード行を変更して :djadmin:`loaddata` を再度実行すると、変更後のデータは消去 されてしまうのです。注意してください。 初期データフィクスチャの自動ロード ----------------------------------- ``initial_data.[xml/yml/json]`` という名前のフィクスチャを作成しておくと、 :djadmin:`syncdb` を実行するたびに自動的にロードされます。この機能はとても 便利なのですが、一つだけ注意が必要です。というのも、 :djadmin:`syncdb` を実行するたびに *毎回* データがリフレッシュされるからです。ですから、 変更する予定のデータに ``initial_data`` を使ってはなりません。 .. Where Django finds fixture files -------------------------------- Django がフィクスチャファイルを探す場所 --------------------------------------- .. By default, Django looks in the ``fixtures`` directory inside each app for fixtures. You can set the :setting:`FIXTURE_DIRS` setting to a list of additional directories where Django should look. デフォルトでは Django は各アプリケーション内の ``fixtures`` ディレクトリから フィクスチャを探します。 :setting:`FIXTURE_DIRS` に Django が調べるべき追加 ディレクトリのリストを設定することができます。 .. When running :djadmin:`manage.py loaddata `, you can also specify an absolute path to a fixture file, which overrides searching the usual directories. :djadmin:`manage.py loaddata ` を実行する時にフィクスチャの絶対パス を指定することもできます。これは通常のディレクトリからの探索を上書きします。 .. seealso:: フィクスチャは :ref:`テストフレームワーク ` で 一貫したテスト環境を構築するためにも使われています。 .. _providing-initial-sql-data: .. _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 ファイルは :doc:`manage.py ` の :djadmin:`sqlcustom` :djadmin:`sqlreset`, :djadmin:`sqlall` および :djadmin:`reset` コマンドの実 行時に参照されます。詳しくは :doc:`manage.py のドキュメント ` を参照してください。 複数の SQL データファイルがある場合、個々のファイルを実行する順番は保証され ていないので注意して下さい。仮定していてよいのは、カスタムの SQL データファ イルを実行する前に、必ずデータベーステーブルは作成されているということだけ です。 .. .. admonition:: Initial SQL data and testing This technique *cannot* be used to provide initial data for testing purposes. Django's test framework flushes the contents of the test database after each test; as a result, any data added using the custom SQL hook will be lost. If you require data for a test case, you should add it using either a :ref:`test fixture `, or programatically add it during the ``setUp()`` of your test case. .. admonition:: 初期 SQL データとテスト テスト用の初期データを提供するためにこのテクニックを使うことは *できません* 。 Django のテストフレームワークは、全てのテストの後ごとにテ ストデータベースの内容をクリアします。結果として、カスタム SQL フックを 使って追加した全てのデータが失われることになります。 テストケースのためにデータが必要なら、 :ref:`テストフィクスチャ ` を使って追加するか、 テストケースの ``setUp()`` でプログラム的に追加する必要があります。 データベースバックエンド特有の SQL データ ----------------------------------------- バックエンド特有の SQL データに対するフックもあります。例えば、 PostgreSQL と MySQL 向けに別々の初期データを用意できます。各アプリケーションごとに Django は ``/sql/..sql`` というファイルを探し ます。 ```` はアプリケーションディレクトリの名前、 ```` はモデル名を小文字にした文字列、 ```` は設定ファイルの :setting:`ENGINE` に指定するモジュール名の最後の部分です。 (:setting:`ENGINE` の値に ``django.db.backends.sqlite3`` に定義したなら Django は ``/sql/.sqlite3.sql`` を探します) バックエンド固有の SQL データは、バックエンド非固有の SQL データよりも前に 実行されます。例えば、アプリケーション中に ``sql/person.sql`` および ``sql/person.sqlite3.sql`` が入っていて、 SQLite をバックエンドにしてインス トールを行った場合、 Django はまず ``sql/person.sqlite.sql`` の内容を実行して から ``sql/person.sql`` を実行します。