cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

Heroku上のDjangoデータベース定義を変更した時

Djangoでモデル定義を変更した時って結構めんどくさいので,なるべく変更したくないんだけど,必要に迫られました.

開発中でデータ消してもいい時でしかもローカルでSQLiteでやってる時とかはデータベースファイルを削除してsyncdbするという超お手軽な方法があるんだけど,

今回はリモートなのとPostgresqlなのでどうやればいいか悩んだのでメモ.

今回のケース

python myproj/manage.py startapp myapp

で作成した[myapp]アプリのmodels.pyを変更した場合で説明する.

基本的にテーブルを削除して,syncdbするので既存のデータを消したくない場合には使えない.

Heroku上のPostgresqlに接続

heroku pg:psql

でデータベースに接続を試みると,

! Unknown database. Valid options are: HEROKU_POSTGRESQL_COLOR_URL

とエラーが出るので

heroku pg:psql HEROKU_POSTGRESQL_COLOR_URL

として接続する.

削除するテーブル名の取得

Djangoでsyncdbをするとテーブル名にmyapp_というプレフィックスがついていることを利用し,
削除対象のテーブル名を取得する

SELECT tablename FROM pg_tables WHERE tablename LIKE 'myapp%';

テーブル削除

取得したテーブル名を使って

DROP TABLE <取得したテーブル名1> , ... , <取得したテーブル名n>;

で削除する.

sycdb

最後に

heroku run python myproj/manage.py syncdb

でmyappアプリのデータベースを作成する.