SQLAlchemyとは
Pythonでよく使われるORMの一つ
Flask-SQLAlchemyとは
SQLAlchemyのエンジンとかsessionmaker/factoryとかテーブルの生成記述を省略したりできる。
version2.xではcreate_engine()とかSQLAlchemyにある機能も搭載されていたが、
version3.xのドキュメントから消えているのでなくなったっぽい?
前のAPIが見たい方はコチラ
実際のコードの違い
SQLAlchemyのモデル定義方法
from sqlalchemy import String, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
# 作成したいモデル
class User:
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True,
autoincrement=True)
username: Mapped[str] = mapped_column(String(30))
email: Mapped[str] = mapped_column(String(30))
# MySQLのURI
SQLALCHEMY_DATABASE_URI = \
"mysql+pymysql://{user}:{password}@{host}/{dbName}?charset=utf8".format(
user = "root",
password = "",
host = "localhost",
dbName = "practice_data_origin",
)
engine = create_engine(SQLALCHEMY_DATABASE_URI)
Base.metadata.create_all(engine)
flask-SQLAlchemyのモデル定義方法
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = \
"mysql+pymysql://{user}:{password}@{host}/{dbName}?charset=utf8".format(
user = "root",
password = "",
host = "localhost",
dbName = "practice_data",
)
db = SQLAlchemy( app )
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer,
primary_key=True,
autoincrement=True)
username = db.Column(db.String(30))
email = db.Column(db.String(30))
with app.app_context():
db.create_all()
接続方法
スレッドセーフにセッションを生成する方法を現状これしか知らないので、SQLAlchemy/flask-sqlalchemyどちらもこれで生成した方が無難かもです
sessionFactroy = sessionmaker(autocommit=False,
autoFlush=True,
bind=engine)
session = scoped_session(sessionFactory)
補足:SQLAlchemyのSQLログ標準出力方法
どんなSQL文が実行されたかをターミナルに出力する方法は3つ。
- loggingで設定する
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
- create_engineの仮引数echoにTrueを入れる
from sqlalchemy import create_engine
engine = create_engine("sqlite://", echo=True)
- (flask-sqlalchemy限定)app.config['SQLALCHEMY_ECHO']
app.config['SQLALCHEMY_ECHO'] = True
補足2:つまずいたポイント
-
SQLAlchemy単体でモデル定義した際、公式のクイックスタートでは、varcharカラム(String)'fullname'に桁数を入力していないため、エラーになるため、桁数設定が必要。
なお、intカラムで桁数入力を省略すると、'11桁'指定になる。 -
flask-SQLAlchemyで、
#↓実行できる
with app.app_context():
db.create_all()
#↓実行できない
db.create_all()
参考にさせていただいたサイト