DjangoにPostgreSQLの導入
WSL:Ubuntu22.04-v1 & VPS
1. フォルダーとファイルの構造
- 本プロジェクトは、JavaScriptを使っています。
- DjangoProject Tree
ProjectRoot$ . ├── .git ├── README.md ├── assets │ ├── admin │ ├── css │ ├── desktop.ini │ ├── fonts │ ├── images │ ├── js │ └── libs ├── blog ├── company ├── contact ├── db.sqlite3 ├── desktop.ini ├── gulpfile.js ├── job │ ├── asgi.py │ ├── desktop.ini │ ├── settings.py │ ├── urls.py │ ├── views.py │ └── wsgi.py ├── manage.py ├── my_env ├── package.json ├── pages ├── readme.txt ├── src ├── static ├── templates │ ├── blog │ ├── bookmark-jobs.html │ ├── company │ ├── contact.html │ ├── index │ ├── manage-jobs-post.html │ ├── manage-jobs.html │ ├── pages │ ├── partials │ └── profile.html └── yarn.lock
2. Djangoのセットアップ
2-1. 前提 条件
Yarn
$ yarn -v 1.22.15
Nodejs
$ node -v v16.15.0 $ npm -v 8.5.5
Gulp Gulpがインストールされ、コンピュータで実行されていることを確認してください。
- 煩雑な処理を自動で行うことができるため、作業を効率的に進められます。
- VSCodeでなくPowerShellで実行するとうまくいきました。
- VScodeは、便利だけど何かエラーのもとになりますね。Woo~
$ yarn global add gulp ・・・OK ~/workspace/Jobcy-Django$ $ gulp --version CLI version: 2.3.0 Local version: Unknown
Git
$ git -v git version 2.39.0
Python
$ sudo update-alternatives --config python3 [sudo] password for matsu: There are 2 choices for the alternative python3 (providing /usr/bin/python3). Selection Path Priority Status ------------------------------------------------------------ 0 /usr/bin/python3.10 110 auto mode 1 /usr/bin/python3.10 110 manual mode *2 /usr/bin/python3.11 100 manual mode
- python3.11
- (注意)Ubuntuで「sudo apt update」する場合は 「0 /usr/bin/python3.10 110 auto mode」にすること。エラーとなります。
- Check Pip version
$ python3 -m pip --version pip 22.3.1 from /home/matsu/.local/lib/python3.11/site-packages/pip (python 3.11)
- Virtualenv
$ virtualenv --version virtualenv 20.13.0+ds from /usr/lib/python3/dist-packages/virtualenv/__init__.py
3. インストール
3-1. Djangoのインストール
- Python3.11で実行
.ProjectRoot$ python3 -m venv my_env source my_env/bin/activate (my_env) $ pip3 install django (my_env) $ pip show Django Name: Django Version: 4.1.5
3-2. データベース接続の設定ファイルの更新
- ProjectRoot/job/settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.#databaseservername#', 'NAME': 'Your Database Name', 'USER' : 'Database User Name', 'PASSWORD' : 'Your Password', 'HOST' : 'Write down Host', 'PORT' : 'Write down port', } }
3-3. データベースのマイグレート
- フォルダー名の変更
- /ProjectRoot/manage.py
(Line9) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jobcy.settings') jobvia ⇒ jobcy
- migration
(my_env) $ python3 manage.py migrate
3-4. 管理者の作成
- Djangoプロジェクト管理者作成(管理画面へのアカウント)
(my_env) $ python3 manage.py createsuperuser Username (leave blank to use 'matsu'): admin Email address: Password: Password (again): Superuser created successfully.
3-5. gulpの起動
- gulpがない場合はインストールします。
(my_env) $ gulp [05:14:00] Local modules not found in ~/workspace/Jobcy-Django [05:14:00] Try running: yarn install
3-6. アプリの起動
- /ProjectRoot/jobcy/settings.py
ALLOWED_HOSTS = ['*']
- 起動
(my_env) $ python3 manage.py runserver 172.28.100.227:8000 (my_env) $ python3 manage.py runserver 0.0.0.0:8000 (Output) Starting development server at http://172.28.100.227:8000/ Quit the server with CONTROL-C. (my_env) $ deactivate
3-7. 静的ファイルのロード
- /ProjectRoot/jobcy/settings.py
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] STATIC_ROOT= os.path.join(BASE_DIR,'assets')
- コマンド
(my_env) python3 manage.py collectstatic 673 static files copied to '/home/<user>/Jobcy-Django/assets'.
3-8. メールの設定(SMTPの構成)
Gmailを使ってメールを送信する設定です。
/ProjectRoot/jobcy/settings.py
# メールサーバーへの接続設定 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'yamasaki@raizin.net' EMAIL_HOST_PASSWORD = 'xxxxxx' DEFAULT_FROM_EMAIL = 'yamasaki@raizin.net'
メールを実際には送らずに、コンソールに表示してくれる設定
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
4. 日本語、日本時間
- /ProjectRoot/jobcy/settings.py
LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
- i18:設定ファイル
- Jobcy-Django/my_env/lib/python3.11/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po
- VSCode拡張機能追加:django.po
5. Githubソース管理
- 新規リポジトリの作成
- Githubで「Jobcy-Django」を事前に作成しておきます。
git init git add . git commit -m "first commit" git branch -M main git remote add origin https://github.com/TechRZN/ProjectRoot.git git push -u origin main
- 「Jobcy-Django_v1.0.0」フォルダーは、Templateのソースとドキュメントです。
6. PostgreSQLの導入
- Search:django migrate sqlite to postgresql
6-1. PostgreSQLのインストール
同じVPS上にサーバーもクライアントもインストールしていますので、同じバージョンとなります。
Install
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update sudo apt -y install postgresql-15
起動
sudo systemctl status postgresql ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Sat 2023-01-07 20:35:52 JST; 1 week 3 days ago
バージョン確認(クライアント)
$ sudo -u postgres -i postgres@i-50100000452180:~$ psql psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1)) postgres=#
バージョン確認(サーバー)
postgres=# select version(); version --------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, 64-bit
DBから抜ける「CTL-D」または「\q]
6-2. DjangoのSQlieからのデータをPostgreSQLへ移行します。
プロジェクトが大きくなるにつれて、MySQLやPostgreSQLなどの標準データベースを移動する必要性となります。しかし、データベースにいくつかのデータがありますよのでsettings.py ファイルを変更するだけで、SQliteデータベースに保存されているすべてのデータが失われます。そのため、このチュートリアルでは、SQliteからPostgreSQLにデータを安全に移行します。
- DBのセッションに入ります。
sudo -u postgres -i $ psql postgres=#
- SQliteから移行するデータを格納するデータベースの作成
CREATE DATABASE job_database;
- このデータベースのユーザーを作成しましす。
CREATE USER job_database_user WITH PASSWORD 'xxxxxx';
- このユーザーに対していくつかのアクセス許可といくつかの構成を指定します。
ALTER ROLE job_database_user SET client_encoding TO 'utf8'; ALTER ROLE job_database_user SET timezone TO 'Asia/Tokyo'; \q exit
6-3. プロジェクトの設定の構成
デフォルトのSQlite以外の選択したデータベースを使用するには、psycopg2パッケージをインストールする必要があります。
× pip install psycopg2 (<https://www.psycopg.org/docs/install.html>) 〇 pip install psycopg2-binary
SQliteのデータを通常のファイルではなくファイルに格納する必要があります。次のコマンドを使用して、データを json ファイルに保存します。
- プロジェクトディレクトリに移動します。
× (my_env) $ python manage.py dumpdata > data.json 〇 (my_env) $ python3 manage.py dumpdata > data.json (Output) data.json
6-4. PostgreSQLをデータベースとして設定する
- データが安全になったので、settings.py ファイルを微調整して、データベースをPostgreSQLとして構成する必要があります。settings.pyの次の行を変更します。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'job_database', 'USER': 'job_database_user', 'PASSWORD': 'adminDE_s0', 'HOST': 'localhost', 'PORT': '' } }
6-5. データの移行
settings.py ファイルを変更した後、次のコマンドを使用して、ユーザー名をデータベース上でPostgreSQLサーバーを実行します。
sudo -u postgres -i postgres@i-50100000452180:~$ psql job_database job_database_user Password for user job_database_user: psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1)) Type "help" for help. job_database=> ...
1.をバックグラウンドで実行し続け、Djangoプロジェクトに戻ってください。次のコマンドを実行します。
(my_env) $ python3 manage.py migrate --run-syncdb
データベースバックエンドをSQLiteからpostgresql に変更します。
(my_env) python3 manage.py migrate --run-syncdb (Output) Operations to perform: Synchronize unmigrated apps: messages, staticfiles Apply all migrations: admin, auth, contact, contenttypes, sessions Synchronizing apps without migrations: Creating tables... Running deferred SQL... Running migrations: Applying contenttypes.0001_initial... OK
jsonファイルにデータがあるので、Djangoに付属しているデータベースにデフォルトのデータは必要ありません。したがって、postgresql を使用して新しいデータベースを作成したので、そのデータベースのデフォルトデータを削除する必要があります。これを行うには、次のコマンドを実行します。
(my_env) $ python3 manage.py shell (Output) Python 3.11.1 (main, Dec 7 2022, 01:11:34) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.contrib.contenttypes.models import ContentType >>> ContentType.objects.all().delete() (35, {'auth.Permission': 28, 'contenttypes.ContentType': 7}) >>> quit()
jsonファイルのデータをデータベース(postgresql)にダンプする必要があります。次のコマンドを使用します。
(my_env) $ python3 manage.py loaddata data.json
※これでSQLiteから以前のデータが全て移行されました。 6. PosgreSQL
- データベース一覧の表示
- $ sudo -u postgres -i
- $ psql job_database job_database_user
job_database=> \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges --------------+----------+----------+---------+---------+-------------------------- djangodeploy | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres + | | | | | djangoadmin=CTc/postgres job_database | postgres | UTF8 | C.UTF-8 | C.UTF-8 | postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 | template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
- テーブル一覧の表示
job_database=> \dt; List of relations Schema | Name | Type | Owner --------+----------------------------+-------+------------------- public | auth_group | table | job_database_user public | auth_group_permissions | table | job_database_user public | auth_permission | table | job_database_user public | auth_user | table | job_database_user public | auth_user_groups | table | job_database_user public | auth_user_user_permissions | table | job_database_user public | contact_contact | table | job_database_user public | django_admin_log | table | job_database_user public | django_content_type | table | job_database_user public | django_migrations | table | job_database_user public | django_session | table | job_database_user (11 rows)