Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

DjangoのデータベースとしてMySQLを使う方法

WindowsのDjangoのデータベースとしてエックスサーバーのMySQLをSSH接続で使う方法の解説

Djangoのデータベースとしてエックスサーバー上のMySQLを設定し、SSH接続で使う方法の解説

今回はWindowsにインストールしたDjangoのデータベースとして、それに標準付属するSQLiteではなく、レンタルサーバーとして超有名なエックスサーバーにあるMySQLを使う方法の解説です。なおそのMySQLへはSSH接続でアクセスします。

初心者はやめたほうがいい・・・

今回の記事を書いておきながらアレなんですが・・・、正直、前回記事「DjangoのためにWindowsにmysqlclientをインストールする方法の解説【罠にハマり10時間費やす」でも書いたように、プログラミング初心者(ネットワークにも詳しくない人)は、素直にDjangoに標準搭載されているSQLiteを使うほうが、頭悪い言い方になりますが「1億倍」良いです。

プログラミング初心者でも、Djangoのついでに勉強したいという特殊な性癖を持っている、かつ、エックスサーバーと契約しているのでしっかり活用して元を取りたいという欲がある、という場合は別ですが・・・

前提作業や環境など

以下の前回までの記事でWindowsにPythonをインストールし、その仮想環境を作り、そこにDjangoをインストールすることなどを説明しました。

  1. 【初心者向けGit使い方解説】WindowsのGit BashでGithubにプライベートリポジトリを作成してSSH接続する手順・方法の解説
  2. 【初心者にわかりやすく】WindowsにPython仮想環境を作り、Djangoをインストールする手順・方法を解説
  3. 【初心者向け】Windows上のDjangoで初歩的なアプリを作って表示させる方法の解説
  4. DjangoのためにWindowsにmysqlclientをインストールする方法の解説【罠にハマり10時間費やす】

上4の記事では、Windows上にMySQLをインストールし、エックスサーバー上のMySQLを操作するために必要なmysqlclientというものをpipでインストールしています。

今回もこれらの作業を完了していることを前提としています。

手順その1:エックスサーバーにMySQLのデータベースを新たに作成する

これはネットに多くの解説情報があるのでそちらを調べて実行しておいてください。

エックスサーバー公式:MySQLの設定

必要な情報(サーバー名などサーバーの情報、ユーザー名、パスワードなどなど)は全てしっかりとメモを残しておいてください。あとで使います。

手順その2:エックスサーバーのSSH接続機能を準備する

これもネットに多くの解説情報があるのでそちらを調べて実行しておいてください。

エックスサーバー公式:SSH設定

秘密鍵・公開鍵のファイル名と保存場所などなど必要な情報は全てしっかりとメモを残しておいてください。あとで使います。

手順その3:Djangoのプロジェクト設定ファイルsetting.pyを編集して上書き保存

上でも述べましたが、以下の作業は必ず前回作業「DjangoのためにWindowsにmysqlclientをインストールする方法の解説【罠にハマり10時間費やす」で、mysqlclientをインストールし終えていることが必要不可欠です。

これまでの作業でPythonの仮想環境のvenv_djangoというフォルダを作成し、その中にDjangoのプロジェクト名「mysite」というプロジェクトを作成しました。すると、そのフォルダmysiteの中に、同名のフォルダがまたできています。つまり、

~/venv_django/mysite/mysite

というフォルダ構成になっています。

そして最後のmysiteフォルダの中に、setting.pyというファイルがあります。それをエディタで開いてください。そのファイル冒頭には最初から何も触っていなければ次のようなコメントアウトされた部分があります。

"""
Django settings for mysite project.

Generated by 'django-admin startproject' using Django 4.1.4.

For more information on this file, see
https://docs.djangoproject.com/en/4.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.1/ref/settings/
"""

このすぐ下に、



import MySQLdb as mydb
from sshtunnel import SSHTunnelForwarder
from pathlib import Path

と加筆してください。

次に、下のように、

DATABASES = {
    'default': {
   省略
    }
}

という部分がありますので、このすぐ直前に、以下のコードを加筆してください。(①~⑤はみなさんの環境に合わせて変更する必要があります)

port_num = 10022  # エックスサーバーではデフォルトでポート番号が10022に設定されている
key_path = '①'

ssh_tunnel = SSHTunnelForwarder(
	 ('②', port_num),
	 ssh_username='③',
	 ssh_password='④',
     ssh_pkey=key_path,
	 remote_bind_address=('⑤', ⑥),
)
 
ssh_tunnel.start()

つまり、

port_num = 10022  # エックスサーバーではデフォルトでポート番号が10022に設定されている
key_path = '①'

ssh_tunnel = SSHTunnelForwarder(
省略
)
 
ssh_tunnel.start()

DATABASES = {
    'default': {
   省略
    }
}

という感じになります。

さて上コード中の①~⑤については、

秘密鍵ファイルへの絶対パス(Windowsでは「¥」の取り扱いに注意)
サーバーID.xsrv.jp(お客様の初期ドメイン)。ホスト名(sv***.xserver.jp)でも可。
例:xsample.xsrv.jp
ユーザー名(つまり②でのサーバーIDの部分)
例:xsample
秘密鍵ファイルに対するパスフレーズ
MySQL ホスト名
例:mysql163001233.xserver.jp
3306(レンタルサーバーにおけるMySQLの一般的なポート番号)

となります。みなさんの環境にあわせて書き入れてください。

次に「DATABESE={~}」の部分を編集していきます。もともとその部分は、なにも触っていなければ次のようになっていると思います。

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.sqlite3',
      'NAME': BASE_DIR / 'db.sqlite3',

        },
    }
}

defaultというキーに対応する値である辞書には、Djangoが標準で使うデータベースの情報(SQLite)が記載されているわけです。

それを次のように書き換えます。(⑥~⑧もその書くべき内容はみなさんの環境によって変わります)

DATABASES = {
    'default': {
# 本来        'ENGINE': 'django.db.backends.sqlite3',
# 本来       'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'PORT': ssh_tunnel.local_bind_port,
        'NAME': '⑦',
        'USER': '⑧',
        'PASSWORD': '⑨',
    }
}

この⑦~⑨についても、

作成したデータベースの名前
⑦のデータベースのユーザ名(アクセス権所有者ユーザー)
⑦のデータベースのパスワード

を入力してください。

あるいは、次のようにするのもありです。すなわち、deaultというキーに対応する辞書は一切さわらずに、追加で新しい項目(キーと値=辞書)を作る方法です。

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.sqlite3',
      'NAME': BASE_DIR / 'db.sqlite3',

        },
    'ssh_xserver_mysql': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'PORT': ssh_tunnel.local_bind_port,
        'NAME': '⑥',
        'USER': '⑦',
        'PASSWORD': '⑧',
        },
}

こうするとdefaultのデータベース(つまりPC上のSQLite)とともに、他のデータベースも使えるようになってお得(?)です。このように複数のデータベースを切り替えて使い分けができるわけですね。

なおマイグレート作業のコマンドを入力するときに1つ注意点があります。

注意点:マイグレーションのコマンドで使うデータベースを指示

それはsetting.pyにおいてdefaultをいじらず追加で「ssh_xserver_mysql」というキーに対応する値の辞書を作った場合には、マイグレーションをするときには、コマンドプロンプトでオプションとしてデータベースの名前を指定する必要があります。次のコードにようにしてください。


(venv_django) C:\Users\hogehoge\venv_django\mysite>python manage.py migrate --database=ssh_xserver_mysql

defaultの値である辞書をいじった場合はそのような指定は不要です。

最速でプログラミングをマスターするならTechAcademy [テックアカデミー] 【PR】がオススメです。

マイペースで学ぶなら世界最大級の動画学習サイトUdemyがオススメです。セールで安く買える講座も多数!

愛を分かち合いましょう