この記事について
Django でマスタデータ(初期データ)を準備する方法についてのメモです。
以下の内容を説明します。
1.データの編集
2.データのエクスポート
3.データのインポート(コマンド or マイグレーション内での実行)
1.データの編集
最初にデータベースにデータを登録します。データの登録には管理コマンドのshell
を使ってもいいのですが、一般的にはデータベース管理ツールと呼ばれるソフトを使い、データベース内のテーブルをエクセルのように直接編集する方法を採ります。
データベース管理ツールは主に3種類存在しますが、大体機能は似たり寄ったりなので好きなものを使えばいいでしょう。
1.特定のデータベース専用のもの(phpMyAdmin, pgAdmin等)
2.IDE(PyCharm等)の機能として組み込まれているもの
3.フリーソフト
2018年現在で人気のフリーソフトは「TeamSQL」及び「DBeaver」です。「DBeaver」は知名度が低いですが日本語対応しているので初心者には使いやすいかと思います。
DBeaverメモ
-
データベースから一度に取得する件数は、初期状態では200件と少なめです。データベースを選択した状態で「ファイル」⇒「プロパティ」と選択し、設定画面のEditor→結果セットにてフェッチサイズを変更しましょう(0で全件取得)
-
エクセルのデータをテーブルにコピー&ペーストする手順
-
1.エクセルの表をコピー
-
2.テーブル表示の下の「新しい行を追加」をクリック
-
3.新しい行全体を選択して、右クリックより「高度なペースト」を実行
-
4.保存(Save)
2.データのエクスポート
データをテキスト形式でエクスポートし、どのタイプのデータベースへもインポートできるようにします。Djangoでは初期データとしてプロジェクトに付属させるファイルのことをFixtureファイルと呼んでいます。Fixtureファイルはdumpdataコマンドで作成します。標準の出力フォーマットはJSON形式です(一応yml/xml形式も使える)。
manage.py dumpdata <app_name>.<model_name> > <file_name>.json
※ model_nameを省略するとアプリ全体が対象になる。
エクスポートのメモ
-
出力されたJSONファイルは整形されていません。IDEやテキストエディタの機能で整形しましょう。indentオプションでも可能ですが、ファイルの最初と最後がインデントされておらずちょっと微妙です。
-
日本語の文字列はunicodeの「¥uXXXX」形式にエスケープされます。文字列の内容の確認にはこのようなツールを使います。
3.データのインポート
※ initial_data.jsonによる初期データの投入はDjango 1.7+で廃止となりました。
コマンドによるインポート
アプリのディレクトリにfixtures
というディレクトリを作り、エクスポートしたファイルを格納します。その後以下のコマンドを実行して対象ファイルをインポートします。file_nameに拡張子は不要です。loaddataの動作は「対象のidがあれば上書き、なければ新規登録」なので重複して実行してもエラーにはなりません。
manage.py loaddata <file_name> --app <app_name>
migrationファイルによるインポート
migrationファイル内でloaddataコマンドを呼び出すことで、自動的に初期データを登録することができます。
手順1.以下のコマンドを実行して空のmigrationファイルを作る
manage.py makemigrations <app_name> --empty
手順2.作成された空のマイグレーションを書き換えてloaddataを組み込む。
from django.core.management import call_command
from django.db import migrations
def load_fixture(apps, schema_editor):
call_command('loaddata', '<file_name>', app_label='<app_name>')
class Migration(migrations.Migration):
dependencies = [
('sample', '0001_initial'),
]
operations = [
migrations.RunPython(load_fixture),
]
適用の取り消しが必要な場合はreverse_code
オプションを定義する。
参考:https://stackoverflow.com/questions/25960850/loading-initial-data-with-django-1-7-and-data-migrations