Django アプリのダミーデータを大量投入するスクリプトをかく

モデルのフィールドが変わったり名前変わったりしそうだし、開発初期だと sqlite でサクっとつくって壊したりする。というときでも、とりあえずサイトを動かしたりするためになんらかのダミーデータを大量投入する必要はある。で、つくってたりした。

データ量としては10モデル x 10 とかつくれればよかったから多くはないけど、外部キーの組み合わせでよしなにやる必要があるので結果的にはとりあえず50個とか200個とかの単位でつくった。

人に聞いた

いろいろ

  • python manage.py shell で for でぶんまわす
  • Emacs あたりで生 SQL かいてコピペする
  • むしろ Emacs からそのまま流す
  • mysql workbench なるものがつかいやすいらしい

とかなんかまあなんかいろいろあったけど、とりあえずまだ sqlite だしまあ for でぶんまわした。生SQLをかくのはだるそうだし、ORM であわせたほうが楽っぽい気がしたし。

from django.utils.timezone import now
from myproj.models import MyModel
for i in xrange(1, 50):
    MyModel.object.create(name="name{0}".format(i), create_time=now())

まあこんな感じでゴリゴリ連番でつくっていった

のはいいけど

最初の一回はどうにか1時間くらいでつくったのはいいけど、モデルかわったり、外部キーでいろいろつくらないといけなかったからやっぱりスクリプトにした。やってることはだいたい上記なんだけど、どうしたらラクにできるかと。

python のスクリプトにすればいいだけだった

そりゃそうだったんだが、要は make_sql とか作って python manage.py shell の中で import make_sql make_sql.main() とかすればよかっただけだった。以下はサンプル。

# coding: utf-8

if __name__ == '__main__':
    main()


def main():
    make_user()
    make_author()
    make_book()


def make_user():
    for i in xrange(1, 30):
        User.objects.create(
            name="name{0}".format(i),
            email="email{0}@email.com".format(i),
            is_delete=False)

# あとは外部キーとかたくさんコピペしながら条件付けしてつくっていく
...
# django でのシェルにはいって
python manage.py shell
# インポートして
import make_sql
# 流す
make_sql.main()

まあ

こういう作業はわりと嫌いじゃない。もっと言えばシェルスクリプトにしてからこの python のスクリプト流しらもっとらくだけど、まあそこまではしなくていいかなってところにいる。