投稿日: | 最終更新日:
ConoHaでDjangoのデータベース接続・初期化
ConoHaVPSにセットアップしたDjangoから、データベースへ接続します。
データベース接続・初期化
Djangoのデータベースをセットアップします。Djangoの環境は、ConoHaVPSを利用していますが、DBはVPSとは別サーバを立てました。
※目標は、Apache + mod_wsgi + Djangoという形式のWEBアプリケーションです。
マイグレーション
Djangoでデータベースを利用するには、セットアップの段階でアプリケーションで使用するデータベースを定義する必要があります。マイグレーションとは、そのデータベースの定義を自動的に作成・管理する機能です。旧来データベースに接続して直接変更を行っていましたが、Djangoはモデルから自動生成されるコードの実行で置き換えます。
- 定義変更用のSQLを作成する手間がなくなる
- データベースがバージョン管理されるので複数人での開発作業がやりやすくなる
といったメリットがあります。
作業の流れ
前回の続きです。Djangoを簡易サーバではなくApacheで動かしたところから作業を行います。
- Djangoのデータベースの設定
- 接続確認
- Djangoのデータベースの初期化(マイグレーション)
- 本番環境(Apache)で使えるように設定
準備
以下の準備を行います。
ConoHaVPSの準備
①ConoHaをレンタルします。
②ConoHaにroot以外のユーザを作ります。
③ConoHaにSSH接続するための設定を行います。
④ConoHaへのrootログインを禁止します。
⑤ConoHaのportを22から変更します。
⑥ConoHaVPSへApacheをインストールしてスタートページを表示します。
Python・Djangoの準備
①ConoHaVPSへPython3をインストールします。
②ConoHaVPSへPython3をインストールします。
③ConoHaVPSへWSGIをインストールします。
→ConoHaのVPSにApacheでPythonWebアプリを作る(WSGI)
④ConoHaVPSへDjangoをインストールします。
必要なもの
レンタルサーバ | ConoHaのVPSサーバ |
---|---|
独自ドメイン | ムームードメインで、独自ドメインのみ取得。2年契約で(2,000〜3,000円)くらい? |
ConoHaVPSの環境
アプリケーションサーバ OS | CentOS7.4 |
---|---|
Apache | 2.4.6 (CentOS) |
Python | 3.6.4 |
mod-wsgi | 4.5.24 |
Django | 2.0.2 |
クライアントPC
操作開発用のクライアントPCを用意します。windowsでもmacでも可能ですが、今回はubuntuを利用します。
OS | Ubuntu 16.04.1 LTS 64bit |
---|
データベースの設定・接続確認
ConoHaVPSとは別にあるDBサーバに接続します。MySQLの使用を想定しています。すでに以下のDjangoプロジェクトとアプリケーションが作成済みとします。
プロジェクト名 | test_django |
---|---|
アプリケーション名 | apps |
①VPSにログインします。
②前回作った仮想環境を起動します。
cd . test_django/bin/activate
settings.pyの編集
①DBの接続情報を記述します。settings.pyを編集します。
cd /var/www/cgi-bin/test_django sudo vi test_django/settings.py
下記がDBの設定箇所となります。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
以下のように編集します。DBサーバへの接続情報は、ConoHaの管理画面から確認できます。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dbname', # DB名 'USER': 'username', # DBに接続できるユーザ名 'PASSWORD': 'pass', # DBに接続できるユーザのパスワード 'HOST': 'DBサーバの「プライベートネットワーク名」', # (ローカルホストなら空でも可) 'PORT': 'DBサーバの接続ポート', # (デフォルトポートなら空でも可) } }
②PythonでMySQLを利用する為のモジュールをpipでインストールします。
pip install PyMySQL
以下のモジュールがインストール済みです。
pip freeze Django==2.0.2 mod-wsgi==4.5.24 PyMySQL==0.8.0 pytz==2018.3
manage.pyの編集
①DjangoのプロジェクトにMySQLを利用する事を宣言します。デフォルトではsqliteになっているので、manage.pyの上部に以下の内容を記述します。
mysite/manage.py
記述内容。
import pymysql pymysql.install_as_MySQLdb()
②ここまででrunserverします。
python manage.py runserver
以下の結果がでれば、正常に接続できています。
You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. February xx, 20xx - 01:20:44 Django version 2.0.2, using settings 'test_django.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
起動するとログに以下のような赤文字があります。
You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.
適用されていない14の移行があります。あなたのアプリケーションは、admin、auth、contenttypes、sessionsのマイグレーションを適用するまで、あなたのプロジェクトは適切に動作しないかもしれません。
それらを適用するために ‘python manage.py migrate’を実行してください。
と書かれています。
これは、djangoが内部で使用するテーブル(admin、auth、contenttypes、sessions)が存在しないため、発生していました。後ほど以下のようにマイグレードします。
python manage.py migrate
データベースの初期化
DBサーバへの接続が確認できたら、データベースを初期化します。プロジェクト全体の設定を行う、settings.pyの「INSTALLED_APPS」を見てみます。初期では以下の様な設定になっています。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
各アプリは以下の様な役割を担います。
django.contrib.admin | 管理サイトアプリ |
---|---|
django.contrib.auth | 認証アプリ |
django.contrib.contenttypes | コンテンツタイプフレームワーク |
django.contrib.sessions | セッションフレームワーク |
django.contrib.messages | メッセージフレームワーク |
django.contrib.staticfiles | 静的ファイルの管理フレームワーク |
上記のアプリケーションは、データベースを使います。その為に、初期設定として、テーブルを作成しなければなりません。
「INSTALLED_APPS」はこのプロジェクトのDjangoインスタンスの中で有効化されているすべてのDjangoアプリケーションの名前を保持しています。
アプリは複数のプロジェクトによって使用される事ができます。また、他の開発者が作ったアプリを導入する事ができます。
①下記のコマンドで、migrateファイルを実行します。
python manage.py migrate
以下のような結果が表示されます。
Operations to perform: Apply all migrations: admin, auth, 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 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 sessions.0001_initial... OK
②テーブルが作成されたか確認します。DBへ接続します。
mysql -u [接続ユーザ名] -h private.***.tyo1.database-hosting.conoha.io -p
③テーブル一覧を表示します。
show tables from [データベース名]; +----------------------------+ | Tables_in_[データベース名] | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+
本番環境でもMySQLが使えるようにするには?
①Apacheを再起動します。
sudo systemctl restart httpd
②以下のURLでアクセスします。
http://VPSのグローバルIPアドレス
OR
http://VPSに設定した独自ドメイン
すると、「500 Internal Server Error」が表示されてしまいます。今までの手順を行うことで、runserverの環境であればMySQLを問題なく利用することができました。しかし、runserverの環境はあくまで「開発環境」であり、本番運用の環境ではありません。
③エラーログを確認します。
sudo tail /var/log/httpd/error_log
以下のようなメッセージが出ます。
Did you install mysqlclient?
原因
「test_django/settings.py」のDATABASESに「’ENGINE’: ‘django.db.backends.mysql’,」を記述しましたが、mysqlclientと呼ばれるモジュールが存在しないと怒られています。
解決策
python仮想環境(pyenv)に、mysqlclientをpipでインストールします。いきなりインストールしようとしても今度は「mysql_config not found 」エラーが発生しますので、先に必要なモジュールをyumでインストールしておきます。
①「python-devel」と「mysql-devel」をインストールします。
sudo yum -y install python-devel mysql-devel
インストールが完了します。
〜省略〜 インストール: mariadb-devel.x86_64 1:5.5.56-2.el7 python-devel.x86_64 0:2.7.5-58.el7 完了しました!
※インストールできない場合は、先にepelをインストールして下さい。
sudo yum -y install epel-release
②これで「mysqlclient」がインストールできます。
pip install mysqlclient
※仮想環境にログインしてpipを使用します。
③これで「mysqlclient」がインストールできます。
pip install mysqlclient
インストールできたか確認します。
pip freeze Django==2.0.2 mod-wsgi==4.5.24 mysqlclient==1.3.12 PyMySQL==0.8.0 pytz==2018.3
④これで MySQLdb パッケージがインポートできるようになります。以下のコマンドを入力してエラーが表示されなければOKです。
python -c "import MySQLdb"
⑤再度Apacheを再起動します。
sudo systemctl restart httpd
⑥以下のURLでアクセスします。
http://VPSのグローバルIPアドレス
OR
http://VPSに設定した独自ドメイン
エラーが表示されず、以下の画面が出力されれば成功です。
次回
次回はVPSのDjangoにアプリケーションを作成します。
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1