0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLAlchemyを使用してCloudSQLに接続する方法

Posted at

はじめに

SQLAlchemyを使用してCloudSQLと接続するのに手こずったのでその方法についてのメモです.

CloudRunでデプロイした際にCloudSQLに接続したことを元に記事にしたものです.

MySQLに接続するためのパッケージ

PythonでMySQLに接続するためのパッケージは色々ありますが,今回はPyMySQLを使用します.

インストール

pip install PyMySQL

インスタンスの作成

まず,CloudSQLのコンソールに移動してインスタンスを作成します.SQLの種類は以下の3つから選べます.

スクリーンショット 2023-12-29 18.04.18.png

今回はMySQLを使用します.
使用したいSQLを選択してインスタンス情報を設定してください.
接続が目的なので細かい設定については今回は触れません.

Compute Engine APIが有効になってない場合は有効にしてください.

rootユーザのパスワードは後ほど使用します.メモなど残しておいてください.

インスタンスが作成できたら,サイドバーのデータベースを選択してデータベースを作成します.この時作成したデータベース名も接続の時に使用します.(これは確認できるのでメモに残さなくても大丈夫)

データベースと接続

データベース接続に必要な情報

  • データベースのユーザ名(root)
  • ユーザのパスワード
  • データベース名
  • 接続名

スクリーンショット 2023-12-29 18.46.05.jpg

データベースエンジンの作成

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()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?