2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Flask-SQLAlchemyについて色々

Last updated at Posted at 2023-08-08

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

参考にさせていただいたサイト

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?