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