忘れないようにメモっとく

機械学習とかプログラミングとか。

DjangoでDBのスキーマ変更 ~ sqlite

Djangoのmodels.pyを変更したあと、python manage.py syncdbで変更が反映されない。
データが既に入っているときにスキーマを変更するのはまずいので、普通に考えたら当然。

一度、DBのデータを別ファイルに保存した後に、データをリセット、スキーマが更新されたら、保存しておいたデータを流し込む。
という流れをコマンドでできると思ったけど、データをリセットする部分(python manage.py flush)はsyncdbの直後まで戻すコマンドなので、スキーマの変更はできない。
きれいにやるにはSouthを使うと良いらしい。(今度やる)

今回は、sqliteをファイルごと更新した。

  1. DBのデータを別ファイルに保存
  2. モデル(スキーマ)の書き換え
  3. sqliteのファイル更新
  4. データ流し込む
DBのデータを別ファイルに保存
$ python manage.py dumpdata appname --indent=4 > appname.json

デフォルトはjsonで吐き出される。

モデル(スキーマ)の書き換え

models.pyを書き換えて、

$ python manage.py sql appname
sqliteのファイル更新

sqliteのファイルをどっか別のとこに置いとく。そのあと、syncdb。

$ mv test.db ~/hoge/test.db
$ python manage.py syncdb

新しく、sqliteのファイルが作られるので、パーミッションを正しく設定する。

データ流し込む
$ pythona manage.py loaddata appname.json


このやり方、邪道なので正しくはSouthを。