はじめに
SQLAlchemyを使用してCloudSQLと接続するのに手こずったのでその方法についてのメモです.
CloudRunでデプロイした際にCloudSQLに接続したことを元に記事にしたものです.
MySQLに接続するためのパッケージ
PythonでMySQLに接続するためのパッケージは色々ありますが,今回はPyMySQLを使用します.
インストール
pip install PyMySQL
インスタンスの作成
まず,CloudSQLのコンソールに移動してインスタンスを作成します.SQLの種類は以下の3つから選べます.
今回はMySQLを使用します.
使用したいSQLを選択してインスタンス情報を設定してください.
接続が目的なので細かい設定については今回は触れません.
Compute Engine APIが有効になってない場合は有効にしてください.
rootユーザのパスワードは後ほど使用します.メモなど残しておいてください.
インスタンスが作成できたら,サイドバーのデータベースを選択してデータベースを作成します.この時作成したデータベース名も接続の時に使用します.(これは確認できるのでメモに残さなくても大丈夫)
データベースと接続
データベース接続に必要な情報
- データベースのユーザ名(root)
- ユーザのパスワード
- データベース名
- 接続名
データベースエンジンの作成
from sqlalchemy import create_engine
# データベースエンジンの作成
DATABASE_URL = f"mysql+pymysql://{ユーザ名}:{パスワード}@/{データベース名}?unix_socket=/cloudsql/{接続名}"
engine = create_engine(DATABASE_URL, echo=True)
これ以外は,データベースをSQLAlchmeyで使う時と同じで大丈夫です.
SQLAlchemyに関しては,また別で記事を書く予定です.
おまけ
自分が使用したディレクトリ構成とソースコード載せておきます.
ディレクトリ構成
db_dir
├── __init__.py
├── crud.py #データベース操作の関数を記述
├── database.py #後述
├── dps.py #後述
├── models.py #テーブル定義
database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
# Cloud SQLの接続情報を環境変数から取得
db_user = os.environ.get('DB_USER')
db_password = os.environ.get('DB_PASSWORD')
db_name = os.environ.get('DB_NAME')
cloud_sql_connection_name = os.environ.get('CLOUD_SQL_CONNECTION_NAME')
# データベースエンジンの作成
DATABASE_URL = f"mysql+pymysql://{db_user}:{db_password}@/{db_name}?unix_socket=/cloudsql/{cloud_sql_connection_name}"
engine = create_engine(DATABASE_URL, echo=True)
# データベースセッションの作成
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
# データベースの構造などを定義する際に継承するクラスのようなもの
Base = declarative_base()
dps.py
from . import database
def get_db():
db = database.SessionLocal()
try:
yield db
finally:
db.close()