SQLAlchemy入門 ORM その1

SQLAlchemyが提供するORM機能を使用すると、DBのデータをPythonオブジェクトとみなして扱うことができるようになります。

テーブルクラスの定義

テーブルクラスの定義

大抵のORMではテーブルに対応するクラスを定義します。本講座では便宜上テーブルクラスと呼ぶことにします。また、テーブルクラスから生成したオブジェクトをテーブルオブジェクトと呼ぶことにします。これはDBの1レコードに相当します。

SQLAlchemyではテーブルクラスを定義する際、Baseと呼ばれる型オブジェクトを継承したクラスを作成します。

サンプルです。Userテーブルに対応するテーブルクラスを定義してみます。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()


class User(Base):
    """
    Userテーブルクラス
    """

    # テーブル名
    __tablename__ = 'users'

    # 個々のカラムを定義
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

テーブル生成

以前学習したメタデータを使用してテーブルクラスの情報をDBに反映することができます。Baseからmetadataを取得することができますので、ここで学習した通りの方法でテーブル生成することができます。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
meta = Base.metadata
meta.create_all(engine)

ORMとCRUD

接続とデータを格納するクラスの定義ができました。セッションについて簡単に説明した後ORMを使ってみましょう。

セッション

ORMを使用したCRUDについて学習する前にORMを使用したことがない方向けに、セッションについて雑に説明します。ORMのセッションとはコードとDBで同期を取る仕組みと思ってください。

テーブルクラスのオブジェクトがRDBの1レコードに相当しますが、セッションを介してオブジェクトの状態をDBに反映させることができます。

SQLAlchemyのセッションはsessionmakerを使用します。引数にengineを指定します。

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

それではORMのCRUD処理について見ていきましょう。

Insert

まずはInsertです。session.addメソッドに生成したテーブルオブジェクトを指定します。

例えば、新規ユーザーSuzukiさんのデータをinsertする場合、以下のように記述します。

suzuki = User(name="Suzuki", age=19)
session.add(suzuki)
session.commit()

Select

session.queryメソッドでクエリオブジェクトを取得し、selectを実行することができます。次回細かいクエリの実行方法について学習します。

users_obj = session.query(User).all()

getで主キーを指定することができます。

suzuki = session.query(User).get(1)

Update

テーブルオブジェクトを生成したりqueryメソッドで取得した後、属性を更新してaddすると更新処理が実行されます。例えば先ほどinsertしたSuzukiさんのデータを修正する場合、以下のようになります。

suzuki = session.query(User).get(1)
suzuki.age = 20
session.add(suzuki)
session.commit()

Delete

最後はDeleteです。session.deleteメソッドに削除対象のテーブルオブジェクトを指定します。

session.delete(suzuki)

補足 サンプル

補足として、上記サンプルをまとめたものを掲載します。

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

# DB接続
engine = create_engine('sqlite:///:memory:')

# Base
Base = declarative_base()


# テーブルクラスを定義
class User(Base):
    """
    Userテーブルクラス
    """

    # テーブル名
    __tablename__ = 'users'

    # 個々のカラムを定義
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)


# テーブルクラスのテーブルを生成
Base.metadata.create_all(engine)

# セッション生成
Session = sessionmaker(bind=engine)
session = Session()


# 挿入用レコード作成
suzuki = User(name="Suzuki", age=19)
session.add(suzuki) # insert処理
session.commit()    # commit

# select * from users;
users_obj = session.query(User).all()
for user in users_obj:
    print(user.name)

# select * from users where id = 1;
suzuki = session.query(User).get(1)
suzuki.age = 20

# update
session.add(suzuki)
session.commit()

# delete
session.delete(suzuki)

簡単なCRUD処理について学習しました。次回は様々なクエリの記述方法について学習しましょう。