ホーム >  VPS >  ConoHaでDjangoのデータベース接続・初期化

投稿日:   |  最終更新日:

ConoHaでDjangoのデータベース接続・初期化

VPS

ConoHaVPSにセットアップしたDjangoから、データベースへ接続します。

データベース接続・初期化

Djangoのデータベースをセットアップします。Djangoの環境は、ConoHaVPSを利用していますが、DBはVPSとは別サーバを立てました。

※目標は、Apache + mod_wsgi + Djangoという形式のWEBアプリケーションです。

マイグレーション

Djangoでデータベースを利用するには、セットアップの段階でアプリケーションで使用するデータベースを定義する必要があります。マイグレーションとは、そのデータベースの定義を自動的に作成・管理する機能です。旧来データベースに接続して直接変更を行っていましたが、Djangoはモデルから自動生成されるコードの実行で置き換えます。

  • 定義変更用のSQLを作成する手間がなくなる
  • データベースがバージョン管理されるので複数人での開発作業がやりやすくなる

といったメリットがあります。

作業の流れ

前回の続きです。Djangoを簡易サーバではなくApacheで動かしたところから作業を行います。

  • Djangoのデータベースの設定
  • 接続確認
  • Djangoのデータベースの初期化(マイグレーション)
  • 本番環境(Apache)で使えるように設定

準備

以下の準備を行います。

ConoHaVPSの準備

①ConoHaをレンタルします。

ConoHaVPSをレンタルしてみる

②ConoHaにroot以外のユーザを作ります。

ConoHaのroot以外のユーザを作る

③ConoHaにSSH接続するための設定を行います。

ConoHaのSSH接続

④ConoHaへのrootログインを禁止します。

rootからのログインを禁止

⑤ConoHaのportを22から変更します。

SSH接続するportを22から変更

⑥ConoHaVPSへApacheをインストールしてスタートページを表示します。

ConoHaのVPSにApacheインストール

Python・Djangoの準備

①ConoHaVPSへPython3をインストールします。

ConoHaのVPSにPython3環境を作る

②ConoHaVPSへPython3をインストールします。

ConoHaのVPSにPython3環境を作る

③ConoHaVPSへWSGIをインストールします。

ConoHaのVPSにApacheでPythonWebアプリを作る(WSGI)

④ConoHaVPSへDjangoをインストールします。

ConoHaのVPSに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にアプリケーションを作成します。

ConoHaでDjangoのアプリケーション作成

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告