SQLAlchemyが提供するORM機能を使用すると、DBのデータをPythonオブジェクトとみなして扱うことができるようになります。
Contents
テーブルクラスの定義
テーブルクラスの定義
大抵の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処理について学習しました。次回は様々なクエリの記述方法について学習しましょう。
