SQLAlchemy - Python

SQLAlchemyとは?

SQLを操作すことができるライブラリで、Pythonの標準モジュールではないためインストールが必要です。「 alchemy 」は錬金術という意味です。

MySQLのデータベースを利用するには、Python から MySQL のデータベースを使うためのドライバー「 mysql-connecto-python 」もインストールします。

Flask-SQLAlchemy は、Flask において SQLAlchemy をより簡単に利用するための拡張パッケージです。

pip install sqlalchemy mysql-connector-python

データベースから値を取得

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+mysqlconnector://root:password@localhost/sample")

# ベースクラスの作成
base = declarative_base()

# モデルクラスの作成
class User(base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    age = Column(Integer)

db = sessionmaker(bind=engine)
session = db()

# SQL -------------------------------------------
# SELECT * FROM users;
users = session.query(User).all()
# -----------------------------------------------

for user in users:
    print(user.name)
    print(user.age)
    print("---------------------------------")

session.close()

エラー

mariaDB を利用していて以下のようなエラーが出る場合は、プログラムを変更します。

sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1049 (42000): Unknown database 'sample:charset=utf8mb4&collation=utf8mb4_general_ci'

engine = create_engine("mysql+mysqlconnector://root:password@localhost/sample?charset=utf8mb4&collation=utf8mb4_general_ci")

以下のエラーが出る場合、プログラムを変更します。

F:\app\python\test.py:8: MovedIn20Warning: The ``declarative_base()`` function is now available as sqlalchemy.orm.declarative_base(). (deprecated since: 2.0) (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9) base = declarative_base()

from sqlalchemy.orm import sessionmaker, declarative_base

INSERT

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base

engine = create_engine("mysql+mysqlconnector://root:password@localhost/sample?charset=utf8mb4&collation=utf8mb4_general_ci")

# ベースクラスの作成
base = declarative_base()

# モデルクラスの作成
class User(base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    age = Column(Integer)

db = sessionmaker(bind=engine)
session = db()

for i in range(10):
    user = User(name="name" + str(i), age=i)
    session.add(user)
    session.commit()

発行されるクエリの確認方法

test.py

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
import logging

logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
engine = create_engine("mysql+mysqlconnector://root:password@localhost/sample?charset=utf8mb4&collation=utf8mb4_general_ci")

# ベースクラスの作成
base = declarative_base()

# モデルクラスの作成
class User(base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    age = Column(Integer)

db = sessionmaker(bind=engine)
session = db()

user = User(name="Tom", age=8)
session.add(user)
session.commit()

メソッド

all()

全てのレコードを返す

session.query(User).all()

count()

レコードの件数を返す

session.query(User).count()

first()

レコードを1件だけ取得する

session.query(User).first()