[Python #19] SQLAlchemyでデータベースを操作する

こんにちは。PythonチームのH.Kと申します。今回は、Pythonでデータベースを扱うライブラリ、SQLAlchemyの話をしようと思います。

SQLAlchemyとは

SQLAlchemyとは、Pythonでデータベースを扱うためのライブラリです。SQLを直接記述せずとも、Pythonのコードを書くだけでデータベースを操作することができます。また、MySQLやSQLiteなどの様々なデータベースを同一のコードで操作することが可能です。

SQLAlchemyの使い方

1. DBを読み込むための設定

from sqlalchemy import create_engine

engine = create_engine('sqlite:///sample_db.sqlite3', echo=False)

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

まずはデータベースを読み込み、エンジンを作成します。今回はSQLiteのデータベースを読み込むことを想定しています。

次にベースクラスを作成します。これはPythonでデータベースをクラスとして扱うための準備になります。

以上の手順が何をやっているかよくわからない、という場合は、SQLAlchemyでデータベースを扱うにはこういう準備が必要なんだ、程度に認識していただければ大丈夫です。

2. モデルクラスの作成

from settings import Base, engine
Base.metadata.bind = engine

class Telephones(Base):
    __tablename__ = "telephones"
    __table_args__ = {"autoload": True}

今回はtelephonesというテーブルをTelephonesクラスとして読み込みます。telephonesテーブルは以下のような構造になっています。

FieldTypePrimary key
idINTEGERYES
list_idINTEGERNO
phone_numberVARCHAR(255)NO
called_flagINTEGERNO

3. セッションを作成する

from sqlalchemy.orm import sessionmaker
SessionClass = sessionmaker(engine)  # セッションを作るクラスを作成
session = SessionClass()

SQLAlchemyはセッションを通してクエリを実行するので、そのためのセッションを作成します。

4. テーブルの中身を読み込む

phone_session = session.query(Telephones).first() #telehonesテーブルの最初のレコードを返す
phones_session = session.query(Telephones).all() #telephonesテーブルの全レコードを返す
not_called = session.queryquery(Telephones).filter(Telehones.called_flag == 0).all() #telephonesテーブルの、called_flagカラムが0のレコードをすべて返す

以上のようにして、テーブルの中身を取得できます。レコードのINSERTやUPDATE,DELETEを行うこともできますがここでは割愛します。

おわりに

このように、SQLAlchemyを使えばPythonコード上でデータベースを操作することができます。ファイナルアンサーで運用しているシステムでもこちらを多用しています。SQLデータベースに興味がある人はぜひPythonチームに応募してみてください。

参考文献

SQLAlchemyの基本的な使い方