📈

SQLAlchemy+MySQL+AmazonRDSでDBを作ってみた

2021/09/05に公開

AmazonRDSを使って作ったMySQL DBに、PythonのORMライブラリである SQLAlchemy を使ってテーブルを作成し、書き込んでみましたのでまとめます。

SQLAlchemy のコードはこちら

  • 必要なライブラリのインストール
pip install -r requirements.txt

https://note.nkmk.me/python-pip-install-requirements/

AmazonRDSの設定

  • パブリックアクセス可能にする

  • VPCセキュリティグループのインバウンドルールを下記の様に設定する

  • (とりあえず動かす分には必須ではないですが)django-environ を使って .envファイルからユーザー名やパスワードを取得

.env

USER_NAME='xxx' ## マスターユーザー名
PASSWORD='xxx' ## 最初に設定したパスワード
DB_NAME='xxx' ## DB名、最初に追加設定で付ける必要あり
DB_HOST='xxx' ## エンドポイント
  • envファイル内はスペースを入れられない点に注意

https://blog.websandbag.com/entry/2019/06/13/184034

SQLAlchemy による実装

create_table.py

BASE_DIR = Path(__file__).resolve().parent
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, ".env"))

USER_NAME = env("USER_NAME")
PASSWORD = env("PASSWORD")
DB_NAME = env("DB_NAME")
DB_HOST = env("DB_HOST")

engine = create_engine(
    f'mysql+pymysql://{USER_NAME}:{PASSWORD}@{DB_HOST}/{DB_NAME}',
    connect_args={
        "ssl": {
            "ssl_ca": "global-bundle.pem"
        }
    }
)

テーブルの設定および作成

create_table.py

# テーブルの設定
metadata = MetaData(engine)

Base = declarative_base()

class User(Base):
  __tablename__ = "user"
  __table_args__ = {"mysql_engine": "InnoDB"}

  id = Column("id", Integer, primary_key=True, autoincrement=True)
  name = Column("name", String(255))
  created = Column("created", DATETIME, default=datetime.now, nullable=False)
  modified = Column("modified", DATETIME, default=datetime.now, nullable=False)	
  
  def __init__(self, name):
    self.name = name
    now = datetime.now()
    self.created = now
    self.modified = now

# テーブルの作成
Base.metadata.create_all(engine)

https://docs.sqlalchemy.org/en/14/tutorial/metadata.html

INSERT

create_table.py

# セッションを作るクラスを作成
SessionClass = sessionmaker(engine)
session = SessionClass()

# INSERT
user_a = User(name="Smith")
session.add(user_a)
session.commit()

https://docs.sqlalchemy.org/en/14/tutorial/orm_data_manipulation.html

MySQL WorkBench で DB を確認する

  • Connection Name 適当に付けます
  • Hostname エンドポイントを入力
  • Username マスターユーザー名を入力
  • Password Store in Vault... をクリックしてDBのパスワードを入力する
  • Defalut Schema DB名を入力

  • SSL タブをクリックしてSSL設定画面に切り替え、SSL CA File の 3点リーダーボタンを押して SSL認証用のpemファイルを読み込む

  • Try Connection ボタンを教えて接続できるか試してみましょう

  • うまく行ったらDBに接続し、QueryフォームにSQLを入力してライトニングボタン(赤枠の雷マーク)をクリックしましょう

select * from user

  • 以下のようにDBの内容が表示されます

以上になります、最後までお読みいただきありがとうございました。

コード全文

create_table.py

from sqlalchemy import Column, Integer, create_engine, MetaData, DATETIME, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
from pathlib import Path
import os
import environ

BASE_DIR = Path(__file__).resolve().parent
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, ".env"))

USER_NAME = env("USER_NAME")
PASSWORD = env("PASSWORD")
DB_NAME = env("DB_NAME")
DB_HOST = env("DB_HOST")

engine = create_engine(
    f'mysql+pymysql://{USER_NAME}:{PASSWORD}@{DB_HOST}/{DB_NAME}',
    connect_args={
        "ssl": {
            "ssl_ca": "global-bundle.pem"
        }
    }
)

metadata = MetaData(engine)

Base = declarative_base()

class User(Base):
  __tablename__ = "user"
  __table_args__ = {"mysql_engine": "InnoDB"}

  id = Column("id", Integer, primary_key=True, autoincrement=True)
  name = Column("name", String(255))
  created = Column("created", DATETIME, default=datetime.now, nullable=False)
  modified = Column("modified", DATETIME, default=datetime.now, nullable=False)	
  
  def __init__(self, name):
    self.name = name
    now = datetime.now()
    self.created = now
    self.modified = now

# テーブルの作成
Base.metadata.create_all(engine)

# セッションを作るクラスを作成
SessionClass = sessionmaker(engine)
session = SessionClass()

# INSERT
user_a = User(name="Smith")
session.add(user_a)
session.commit()

.env

USER_NAME='xxxxxxxxxx'
PASSWORD='xxxxxxxxxx'
DB_NAME='xxxxxxxxxx'
DB_HOST='xxxxxxxxx'

requirements.txt

SQLAlchemy==1.4.23
greenlet==1.1.1
django-environ==0.6.0
PyMySQL==1.0.2

参考サイト SQLAlchemy

https://qiita.com/ariku/items/75799665acd09520bed2

https://docs.sqlalchemy.org/en/14/tutorial/

https://aws.amazon.com/jp/rds/

https://petitviolet.hatenablog.com/entry/20131219/1387463336

参考サイト AmazonRDS

https://teratail.com/questions/149605

https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-connectivity-instance-subnet-vpc/

https://teratail.com/questions/114766

https://www.it-mure.jp.net/ja/mysql/flasksqlalchemyを使用してaws-rds-mysqlデータベースインスタンスに接続する/1071073609/

Discussion