はじめに
Djangoチュートリアル③(モデルの作成、Django Admin)ではデフォルトの SQLite データベースの設定を行った。本記事では、PostgreSQL の設定を試してみる。あらかじめ存在している AWS 上に構築されている PostgreSQL を利用するため、①データベースの設定、②データベースからモデルを定義、③マイグレーションまで行う。Integrating Django with a legacy database を参考にした。
①データベースの設定
まず config/settings.py におけるデフォルト設定(SQLite)を以下に示す。SQLite の 'NAME' は使用するファイルの絶対パスを指定している。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
上記を以下のように変更する。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': [database_name],
'USER': [user_name],
'PASSWORD': [password],
'HOST': ***.amazonaws.com,
'PORT': '5432'
}
}
SQLite では 'ENGINE' として 'django.db.backends.sqlite3' としていたのを、'django.db.backends.postgresql' に変更しており、あとは DB の設定で必要とされるものを順に指定している。
さらに以下コマンドで PostgreSQL のドライバとして paycopg2-binary をインストールする。
$ pip install psycopg2-binary
上記で行ってきたデータベースの設定で正しく接続できているかは以下コマンドで確認できる。
$ python manage.py dbshell
②データベースからモデルを定義
既存のデータベースを使用しているため、当然モデルの定義がされておらず、Django ORM を使用することができない。Django ではデータベースからモデルを自動生成する inspectdb
コマンドが準備されているので、それを利用してモデルを定義する。以下コマンドでは、出力結果をそのまま [app_name]/models.py に保存している。
$ python manage.py inspectdb > [app_name]/models.py
各モデルクラス内のサブクラスである class Meta の項目が意味するものは以下。
- managed:各テーブルの作成、変更、および削除を管理するかどうか。デフォルトでは False。
- db_table:テーブル名。
モデルを定義できたので、有効化するために config/settings.py の INSTALLED_APPS に登録しておく。登録する方法はDjangoチュートリアル③(モデルの作成、Django Admin)のモデルの有効化と同様。
③マイグレーション
以下コマンドでマイグレーションを行う。
$ python manage.py makemigrations [app_name]
$ python manage.py migrate
テーブルのアクセスは以下コマンドなどで確認できる。
$ python manage.py shell
>>> from [app_name].models import [model_name]
>>> [model_name].objects.all()
おわりに
既存のデータベースからモデルを自動作成でき、非常に便利なことがわかった。新規データベースでも、モデルを定義するよりデータベースを先に作ってそれからモデルの自動作成をした方が楽なのかも。わかったことがあれば、追記していきたい。