ここまで来ておいてなんなんですが、SQLiteを使用しているとデータベースがロックされてどうにもならない事が起きてしまい、どうしたものかと思案していたのですが、「やはりここはDBそのものを変えてしまえ!」と囁かれたので、突然ですが、使用するデータベースを変更したいと思います。
- 15.データベースをPostgreSQLに変更する
- 15-1.Ubuntuのパッケージを更新
 - 15-2.PostgreSQLのインストール
 - 15-3.PostgreSQLサービスの起動
 - 15-4. PostgreSQLサービスの状態確認
 - 15-5.PostgreSQLユーザーへの切り替え
 - 15-6. PostgreSQLシェル(psql)の起動
 - 15-7. デフォルトのPostgreSQLユーザーのパスワード設定
 - 15-8. データベースとユーザーの作成
 - 15-9.PostgreSQLの終了
 - 15-10. psycopg2 のインストール
 - 15-11. Djangoのsettings.pyでデータベース設定する
 - 15-12. マイグレーションの実行
 - 15-13. スーパーユーザーの作成
 - 15-14.データベース構築
 - 15-15. 半自動起動の設定を行う
 - 15-16. A5:SQLから接続する
 
 - 関連するポスト
 
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 の設定はローカル接続のみを許可しています。
外部からの接続を許可するには、以下のように変更することをお勧めします。
- ローカル接続(Unix domain socket)はそのままにします。
 - IPv4とIPv6のローカル接続設定はそのままにします。
 - 外部からの接続を許可するために、新しい行を追加します。
 
| 
					 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  | 
					
この変更により、
- 0.0.0.0/0は全てのIPv4アドレスからの接続を許可します。
 - md5はパスワード認証を使用することを意味します。
 
・この設定は全てのIPアドレスからの接続を許可するため、セキュリティリスクが増加します。実際の運用環境では、特定のIPアドレスやサブネットからの接続のみを許可するなど、より制限的な設定を検討してください。
・変更後、PostgreSQLサービスを再起動する必要があります。
| 
					 1  | 
						sudo service postgresql restart  | 
					
関連するポスト







        
        
        
        
        
        
        
        
        
        
        
        
        
        




