はじめに
Google Cloud SQLもDjangoで使用するDBの選択肢の一つです。
Djangoを開発中のローカル環境からProxyを使って接続する、私が主に使用している方法です。
Proxyの部分は公式をなぞるのみです。
この記事はmacOSですが、LinuxでもProxyのインストールコマンドが違うのみで、その他は同様かと思います。
環境
OS: macOS 10.12 Sierra
Python: 3.6.3
Django: 1.11.2
Cloud SQL: 第二世代 MySQL 5.7
前提
以下、前提です。
Cloud SDKはインストールされており、認証も済んでいる
されていない場合はこちらが公式です -> Cloud SDK のインストール
え?認証?よくわからないって場合はとりあえずこれでいけるかと思います。
参考までに。
gcloud auth application-default login
Cloud SQLのインスタンスは作成されている
第二世代 MySQL 5.7 で。
Cloud SQLのAPIは有効化されている
Google Cloud Platform(以下、GCP)上の左上メニュー -> 「APIとサービス」から見つかります。Google Cloud SQL APIのことです。
MySQLはローカルマシンにインストールされている
されていますか?
念のため、MySQLがポート3306を使用してされていないことを確認してください。
lsof -n -P -i:3306
です。使われてたら止めてやってください。
Cloud SQLで接続ユーザーを作成する
Cloud SQLダッシュボードからユーザーを作成してください。
Cloud SQLダッシュボード:「左上のメニュー」->「SQL」
インスタンスを選択し、「インスタンスの詳細」から「ユーザー」で「ユーザーアカウントの作成」というボタンが見つかるはずです。
ここでは
ユーザー名: testuser
パスワード: password
ということにします。
Proxyのインストール
インストールしたいディレクトリへ移動してください。
そしてcurl
です
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
Linuxの場合はこちらから
そして実行権限を付与
chmod +x cloud_sql_proxy
Proxyを開始
接続するインスタンスの「インスタンス接続名」を調べます。
GCPのダッシュボード左上のメニューからSQLを選択し、接続したいインスタンスを選択します。すると、インスタンスの詳細という画面から「このインスタンスに接続」という箇所がありますので「インスタンス接続名」をコピーしてください。
その上で、cloud_sql_proxyをインストールしたディレクトリへ移動し、下のコマンドを実行します。
もちろん<INSTANCE_CONNECTION_NAME>
を上でコピーした「インスタンス接続名」で置き換えてください。つまり、-instance="aaaa:bbb:ccc"
といった形です。
ちなみに、Macだと-instance
の後にDoubleQuotation""なしでも大丈夫ですがLinuxだとダメです。ハマったことあります。
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
MySQLセッションの開始とデータベースの作成
Proxyを起動している状態で先ほど作成したdjango
というユーザーでログインしましょう。プロトコルはtcpです。
mysql -h localhost --port 3306 --protocol tcp -u root -p
PostgreSQLの場合はこちらです
psql -U postgres -h 127.0.0.1 --port 5432
MySQLセッションが開始できたらDjangoで使用するデータベースを作成しておきましょう。データベース名はtestdbとします。
CREATE DATABASE testdb;
pymysqlのインストールとDjangoの設定
MySQLをDjangoで使用するたの設定です。
Djangoで使用する環境へ移動し、pymysqlをpipでインストールします。
sudo apt install libmysqlclient-dev
pip install PyMySQL
インストールしたら、Djangoプロジェクト内に以下を記述します。ベストプラクティスはわかりませんが、データベース設定を変更したいので今回はsetting.pyに記述します。
import pymysql
pymysql.install_as_MySQLdb()
さて、そのままデータベース設定を変更しましょう。
何も変更していない状態では以下の設定のはずです。
これを
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
こうです
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdb',
'USER': 'testuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306'
}
}
あとはpython manage.py migrate
してあげれば(まだmakemigrations
していなければmakemigrations
も)、あたかもローカル環境のデータベースに接続しているような感覚で開発ができるはずです。
ちなみにサーバ環境では、サーバのIPをCloud SQL側で承認ネットワークに追加し、setting.pyのHOST
をCloud SQLのIPにしてやるとそのまま使えたりします。