【DRF】venv仮想環境を用いて、DRFシステムで書籍管理システムを作成する(7)データベースをPostgreSQLに変更する
ここまで来ておいてなんなんですが、SQLiteを使用しているとデータベースがロックされてどうにもならない事が起きてしまい、どうしたものかと思案していたのですが、「やはりここはDBそのものを変えてしまえ!」と囁かれたので、突然ですが、使用するデータベースを変更したいと思います。
15.データベースをPostgreSQLに変更する
15-1.Ubuntuのパッケージを更新
最初に、Ubuntuのパッケージリストを最新に更新します。
1 2 |
sudo apt update sudo apt upgrade -y |
15-2.PostgreSQLのインストール
次に、PostgreSQLをインストールします。
PostgreSQLの最新版は、postgresql パッケージからインストール可能です。
1 |
sudo apt install postgresql postgresql-contrib -y |
15-3.PostgreSQLサービスの起動
インストールが完了したら、PostgreSQLサービスを起動します。
1 |
sudo service postgresql start |
15-4. PostgreSQLサービスの状態確認
サービスが正常に起動しているか確認します。
1 |
sudo service postgresql status |
12/main (port 5432): online の様に表示されれば、PostgreSQLは正しく動作しています。
15-5.PostgreSQLユーザーへの切り替え
デフォルトでは、PostgreSQLは postgres
というスーパーユーザーアカウントを作成します。このユーザーに切り替えます。
1 |
sudo -i -u postgres |
15-6. PostgreSQLシェル(psql)の起動
1 |
psql |
これでPostgreSQLのコマンドラインインターフェースが開きます。
データベース管理やSQLクエリを実行できます。
15-7. デフォルトのPostgreSQLユーザーのパスワード設定
PostgreSQLシェルに入ったら postgres
ユーザーのパスワードを設定しておくと便利です。
1 |
\password postgres |
これで、新しいパスワードを入力して設定します。
15-8. データベースとユーザーの作成
開発に使用するデータベースを作成します。
今回の場合は書籍管理システムなので、データベース名は「book_management_system」とします。
1) データベースの作成
1 |
CREATE DATABASE book_management_system; |
2) ユーザの作成と各種設定
1 2 3 4 5 |
CREATE USER pgsql_hogehoge WITH PASSWORD 'pgsql_passwd'; ALTER ROLE pgsql_hogehoge SET client_encoding TO 'utf8'; ALTER ROLE pgsql_hogehoge SET default_transaction_isolation TO 'read committed'; ALTER ROLE pgsql_hogehoge SET timezone TO 'UTC'; |
3) ユーザーにデータベースへのアクセス権を付与
1 |
GRANT ALL PRIVILEGES ON DATABASE book_management_system TO pgsql_hogehoge; |
15-9.PostgreSQLの終了
作業が終わったら psql
を終了します。
1 |
\q |
postgres
ユーザーからもログアウトするには以下を入力します。
1 |
exit |
15-10. psycopg2 のインストール
psycopg2は、PythonからPostgreSQLデータベースに接続して操作するためのライブラリです。
1) PostgreSQLの開発用パッケージをインストール
1 |
sudo apt install libpq-dev |
2) psycopg2 をインストール
1 |
pip install psycopg2 |
15-11. Djangoのsettings.py
でデータベース設定する
config/settings.py
を編集して、PostgreSQLをデータベースエンジンとして指定します。
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'book_management_system', 'USER': 'pgsql_hogehoge', 'PASSWORD': 'pgsql_passwd', 'HOST': 'localhost', 'PORT': '5432', } } |
15-12. マイグレーションの実行
遥か前になってしまいましたが、項番2-2 で行った「マイグレーション」をここで再度行います。
1 |
(venv) ~$ python3 manage.py migrate |
なぜかマイグレーションに失敗したので対策します。
仮想環境が正しくアクティブになっているかを確認
1 2 3 4 5 |
(venv) *********@DESKTOP-7GBREKH:~/source/drf3/django$ which python /home/*********/source/drf3/django/venv/bin/python # アクティベート実行 (venv) *********@DESKTOP-7GBREKH:~/source/drf3/django$ source /home/*********/source/drf3/django/venv/bin/activate |
psycopg2
のバージョンが最新であることを確認するために、以下のコマンドを実行
1 2 3 4 5 6 |
(venv) *********@DESKTOP-7GBREKH:~/source/drf3/django$ pip install --upgrade psycopg2 Collecting psycopg2 Using cached psycopg2-2.9.9-cp312-cp312-linux_x86_64.whl Installing collected packages: psycopg2 Successfully installed psycopg2-2.9.9 |
マイグレーション実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
(venv) *********@DESKTOP-7GBREKH:~/source/drf3/django$ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, book, 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 auth.0012_alter_user_first_name_max_length... OK Applying book.0001_initial... OK Applying sessions.0001_initial... OK |
どうやら成功したようです。
15-13. スーパーユーザーの作成
項番3-1で行った、管理者としてDjango管理サイトにアクセスできるスーパーユーザーを作成します。
1 |
(venv) ~$ python3 manage.py createsuperuser |
ユーザー名、メールアドレス、パスワードを入力します。
パスワードは最低8文字が必要です。
また入力時にパスワードは表示されない(見えない)ので、間違えずに入力して下さい。コピペ推奨。
15-14.データベース構築
項番4-2で行ったモデルファイルからデータベースの(テーブル)構築を行います。
行う前に、sqliteで作成されていたファイルを削除します。
1 2 |
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete |
モデルファイルが作成できたらデータベースの構築が必要になりますので、下記コマンド(makemigrations)を実行します。
ここでも引っかかったので、下記を実行します。
仮想環境を再作成
1 2 3 4 5 |
deactivate rm -rf venv python3 -m venv venv source venv/bin/activate pip install django==4.2 djangorestframework psycopg2-binary |
上記を実行した後、ようやく下記の makemigrations が実行できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(venv) ~$ python3 manage.py makemigrations # 結果 (venv) :~/source/drf3/django$ python3 manage.py makemigrations Migrations for 'book': apps/book/migrations/0001_initial.py - Create model Author - Create model Book - Create model Genre - Create model Publisher - Create model BookAuthor - Add field authors to book - Add field genre to book - Add field publisher to book |
続けて下記コマンド(migrate)を実行します。
1 2 3 4 5 6 7 |
(venv) ~$ python3 manage.py migrate # 結果 Operations to perform: Apply all migrations: admin, auth, book, contenttypes, sessions Running migrations: Applying book.0001_initial... OK |
マイグレーションした結果のファイルができが上がっています。
drf3/django/apps/book/migrations ディレクトリ内を確認。
1 2 3 4 5 6 7 |
*********@DESKTOP-7GBREKH:~/source/drf3/django/apps/book/migrations$ ls -al total 16 drwxr-xr-x 3 ********* ********* 4096 Oct 14 22:42 . drwxr-xr-x 6 ********* ********* 4096 Sep 7 23:50 .. -rw-r--r-- 1 ********* ********* 3849 Oct 14 22:42 0001_initial.py ←★これ -rw-r--r-- 1 ********* ********* 0 Sep 5 23:20 __init__.py drwxr-xr-x 2 ********* ********* 4096 Oct 14 22:43 __pycache__ |
「0001_initial.py」が、マイグレーション実行時に作成されるファイルです。
テーブル構造を変更するなどしてマイグレーションを実行するたびに、連番のファイルが次々と出来上がる仕組みとなっています。
マイグレーション状態の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
(venv) *********@DESKTOP-7GBREKH:~/source/drf3/django$ python3 manage.py showmigrations admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length [X] 0010_alter_group_name_max_length [X] 0011_update_proxy_permissions [X] 0012_alter_user_first_name_max_length book [X] 0001_initial contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sessions [X] 0001_initial |
すべて成功しているっぽいです。
15-15. 半自動起動の設定を行う
WSLが起動した際に、PostgreSQLが半分ぐらい自動起動するようにします。半分ってところがミソ(苦笑)
WSLでは、通常のLinuxのようにinit.dやsystemdが使えないため、手動でサービスを起動する必要があります。
ではどうするか?
WSLを起動するたびにPostgreSQLを自動で起動するスクリプトを作成できるので、新しいUbuntuのウィンドウを開いて以下の手順で作成します。
1) ホームディレクトリに移動
1 |
cd ~ |
2) .bashrc
ファイルを編集
1 |
vi .bashrc |
3) ファイルの最後に以下の行を追加
1 |
sudo service postgresql start |
追記したら Esc + w + q で保存してviエディタを終了させます。
4) 設定を反映
次回WSLを起動したときに自動的にPostgreSQLが起動するようにするため、以下のコマンドで.bashrc
を再読み込みします。
1 |
source ~/.bashrc |
これでWSLを起動するたびにPostgreSQLが自動的に起動するようになります。
ただし、毎回 sudo
のパスワード入力が求められる場合があるで、半自動と行った感じとなってしまうのが残念なところです。
15-16. A5:SQLから接続する
いろんな現場で使用されている、データベースクライアントつーるである「A5:SQL」から接続する設定を行います。
新しくターミナルを開き、下記コマンドで設定ファイルを vi エディタで開きます。
現在の pg_hba.conf
の設定はローカル接続のみを許可しています。
外部からの接続を許可するには、以下のように変更することをお勧めします。
1. ローカル接続(Unix domain socket)はそのままにします。
2. IPv4とIPv6のローカル接続設定はそのままにします。
3. 外部からの接続を許可するために、新しい行を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sudo vi /etc/postgresql/[version]/main/pg_hba.conf # Database administrative login by Unix domain socket local all postgres peer # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 md5 host replication all ::1/128 md5 #★以下を追記する # Allow external connections (add this line) host all all 0.0.0.0/0 md5 |
この変更により、
1. 0.0.0.0/0は全てのIPv4アドレスからの接続を許可します。
2. md5はパスワード認証を使用することを意味します。
【注意点】
・この設定は全てのIPアドレスからの接続を許可するため、セキュリティリスクが増加します。実際の運用環境では、特定のIPアドレスやサブネットからの接続のみを許可するなど、より制限的な設定を検討してください。
・変更後、PostgreSQLサービスを再起動する必要があります
1 |
sudo service postgresql restart |