DjangoでDBにfixtureでデータ初期登録
初期データやテストで使うデータをデータベースに最初から用意しておきたいということがあります。
そんなときに使うのがfixture
です。Djangoで初期データを登録する方法を書きます。
from django.db import models
class Customer(models.Model):
name = models.CharField(max_length=100)
phone = models.CharField(max_length=20)
email = models.CharField(max_length=255)
age = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
fixtureファイル準備
今回はJSON
を使います。XML
やYAML
でも記述できます。
アプリ(今回の場合はaccounts
というアプリ名で作ってます)の中にfixtures
というディレクトリを作成してその中にcustomer_init.json
を作成
[
{
"model": "accounts.customer",
"pk": 1,
"fields": {
"name": "Tanaka Tarou",
"phone": "09011111111",
"email": "tanaka@gmail.com",
"age": 35,
"created_at": "2021-09-13 00:00:05"
}
},
{
"model": "accounts.customer",
"pk": 2,
"fields": {
"name": "Satoh Jirou",
"phone": "09022222222",
"email": "satoh@gmail.com",
"age": 25,
"created_at": "2021-09-13 00:00:10"
}
}
]
コマンドでDBに入れる
データを入れるのは簡単で、コマンドをたたけば完了です。
python manage.py loaddata customer_init.json
入れたデータを確認
データを入れたので、Django shellで確認してみます。
>>> Customer.objects.all()
<QuerySet [<Customer: Customer object (1)>, <Customer: Customer object (2)>]>
>>> for c in Customer.objects.all():
... print(c.name, c.phone, c.email, c.age, c.created_at)
...
Tanaka Tarou 09011111111 tanaka@gmail.com 35 2021-09-12 15:00:05+00:00
Satoh Jirou 09022222222 satoh@gmail.com 25 2021-09-12 15:00:10+00:0
DBの設定やってなくて、DBのタイムゾーンの問題でUTCになっていますが想定したデータが投入されていますね。
DBデータをdump
jsonファイルで手書きで作っても良いですが、データ数多くなると間違いも増えるし、手間がかかって仕方ありません。そんなときはデータをダンプしましょう。
python manage.py dumpdata <アプリ名> > ファイル名
でダンプできます。
python manage.py dumpdata accounts > accounts.json
改行されていないですが、ダンプできました。
[{"model": "accounts.customer", "pk": 1, "fields": {"name": "Tanaka Tarou", "phone": "09011111111", "email": "tanaka@gmail.com", "age": 35, "created_at": "2021-09-12T15:00:05Z"}}, {"model": "accounts.customer", "pk": 2, "fields": {"name": "Satoh Jirou", "phone": "09022222222", "email": "satoh@gmail.com", "age": 25, "created_at": "2021-09-12T15:00:10Z"}}]
もしくは特定のmodel(テーブル)のデータだけ取り出したいということもあると思います。
そんな時は
python manage.py dumpdata <アプリ名>.<model> > ファイル名
でダンプできます。
python manage.py dumpdata accounts.customer > accounts_customer.json
今回はmodel一つしかないので同じですが、場合によってはバックアップにも使えますね。