見出し画像

Djangoのデータベーステーブルのバックアップ&リストア方法のメモ

はじめに

こんにちは。しょうです。
今まで、RHEL8+docker-compose+Django+PostgreSQL環境に
おけるWebサービス構築学習を通じて、以下のメモを残しています。


1個目のメモは
AWS EC2インスタンス-RHEL8上に開発環境の基礎となる
dockerとdocker-composeのインストール手順について書いています

2個目のメモは
1個目のメモで基礎を作った上に、DjangoとPostgreSQL環境のセットアップ
手順について書いています。


3個目となる今回のメモは
Djangoで使用するデータベーステーブルのバックアップとリストアの
手順について書いていこうと思います。


メモ

今回の環境でDjangoでWebサービス開発の勉強をしている時、
コンテナを削除するとデータベーステーブルに保存しているデータも
併せて削除されてしまう事象を確認しました。
(admin管理画面に入るためのユーザも消えてしましました。)
DjangoにWebブラウザでアクセスすると以下のエラーが確認出来ました。

画像1


dockerコンテナ上でしかデータを管理していない状態で
コンテナを削除してしまうと、消えてしまうのは当たり前なのですが、
開発途中なのでコンテナを稼働させたり削除させた理を頻繁に行う。
そのたびにデータが消えてしまう。
また、毎回毎回消えてしまうのは実運用の事を考えても
普通によろしくない(笑)

dockerベースでバックアップ的なことが出来ればよかったのですが、
Djangoの技術でバックアップリストアを簡単に行うことが出来ることが
分かったので、とりあえずこの手順で暫く開発を行っていこうと思う。


試験用に以下のデータを用意した。

画像2


Djangoのコンテナにアクセスし、次のコマンドを実行することで全アプリの
全データベーステーブルをjson形式で出力することが出来る。
>以降は任意のファイル名でOK
これでバックアップが取れるんだから便利だよな~

root@ddf1ad55ee2a:/code# python manage.py dumpdata > 20210607dump.json  
root@ddf1ad55ee2a:/code# ls  
20210607dump.json  blogpost     docker-compose.yml  requirements.txt  
Dockerfile         blogproject  manage.py


先程作成したjsonファイルがホストOSにも存在していることを確認する。

[root@ip-10-0-1-4 test_env]# ls  
20210607dump.json  blogproject         Dockerfile  requirements.txt  
blogpost           docker-compose.yml  manage.py


試験の為にdockerコンテナを削除する。

[root@ip-10-0-1-4 test_env]# docker stop $(docker ps) 
[root@ip-10-0-1-4 test_env]# docker rm $(docker ps -a) 
[root@ip-10-0-1-4 test_env]# docker ps -a  
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


そして再度docker-composeを実行してコンテナを稼働させる。
WebブラウザでDjangoにアクセスし、データが消えていることが分かる。

画像3


この状態でDjangoコンテナにアクセス。
manage.py migrateを実行し、リストアする用のデータベーステーブルを
用意する。
※この辺りはPostgreSQLのリストアのイメージに近いイメージ。

root@32c6107d7138:/code# python manage.py migrate  
Operations to perform:  
 Apply all migrations: admin, auth, blogpost, contenttypes, sessions  
Running migrations:  
 Applying contenttypes.0001_initial... OK  
 Applying auth.0001_initial... OK  
 Applying admin.0001_initial... OK  
 Applying admin.0002_logentry_remove_auto_add... OK  
 Applying admin.0003_logentry_add_action_flag_choices... OK  
 Applying contenttypes.0002_remove_content_type_name... OK  
 Applying auth.0002_alter_permission_name_max_length... OK  
 Applying auth.0003_alter_user_email_max_length... OK  
 Applying auth.0004_alter_user_username_opts... OK  
 Applying auth.0005_alter_user_last_login_null... OK  
 Applying auth.0006_require_contenttypes_0002... OK  
 Applying auth.0007_alter_validators_add_error_messages... OK  
 Applying auth.0008_alter_user_username_max_length... OK  
 Applying auth.0009_alter_user_last_name_max_length... OK  
 Applying auth.0010_alter_group_name_max_length... OK  
 Applying auth.0011_update_proxy_permissions... OK  
 Applying blogpost.0001_initial... OK  
 Applying blogpost.0002_blogmodel... OK  
 Applying sessions.0001_initial... OK  


その後同コンテナ内でmanage.py loaddataコマンドを実行してデータベーステーブルにデータをリストアする

root@32c6107d7138:/code# python manage.py loaddata 20210607dump.json   
Installed 44 object(s) from 1 fixture(s)  
root@32c6107d7138:/code#


admin管理画面にログイン出来、かつデータが復活していることを
確認する。少しずつではあるがベースの環境に依存しにくい
開発環境が出来ている気がする・・・!

画像4


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?