📈
SQLAlchemy+MySQL+AmazonRDSでDBを作ってみた
AmazonRDSを使って作ったMySQL DBに、PythonのORMライブラリである SQLAlchemy を使ってテーブルを作成し、書き込んでみましたのでまとめます。
SQLAlchemy のコードはこちら
- 必要なライブラリのインストール
pip install -r requirements.txt
AmazonRDSの設定
-
パブリックアクセス可能にする
-
VPCセキュリティグループのインバウンドルールを下記の様に設定する
-
(とりあえず動かす分には必須ではないですが)django-environ を使って .envファイルからユーザー名やパスワードを取得
.env
USER_NAME='xxx' ## マスターユーザー名
PASSWORD='xxx' ## 最初に設定したパスワード
DB_NAME='xxx' ## DB名、最初に追加設定で付ける必要あり
DB_HOST='xxx' ## エンドポイント
- envファイル内はスペースを入れられない点に注意
SQLAlchemy による実装
-
フォーマット済み文字列を使い、DBのURL内に上述のユーザー名等を設定する
-
SSL接続に必要な pem ファイルをダウンロードし、カレントディレクトリに保存する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
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)
INSERT
create_table.py
# セッションを作るクラスを作成
SessionClass = sessionmaker(engine)
session = SessionClass()
# INSERT
user_a = User(name="Smith")
session.add(user_a)
session.commit()
MySQL WorkBench で DB を確認する
- 公式サイトでダウンロード
https://www.mysql.com/jp/products/workbench/
- 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
参考サイト AmazonRDS
Discussion