SQLAlchemyでSELECT文を書く

前提

次のクラスをテーブルのための例とする.

class Books(Base):
__tablename__ = "books"
id = Column(String(7), primary_key=True)
price = Column(Integer)
title = Column(Text)
flag = Column(Boolean)

SQLのSELECT文の作り方

SQLAlchemyではレコードの選択をqueryで行い,絞り込んだ上でall等により抽出する.
ここで,filterはSQLのWHERE句に相当する.

セッション名.query(取り出したいもの).filter(絞り込み条件).抽出方法

抽出するレコードの量による抽出方法の違い

all

allは複数ヒットするものに使う.
次の例は,1000円以上の書籍の品番と名前を抽出する.

session.query(Books.id, Books.title).filter(Books.price >= 1000).all()

first

firstは1行に決まるケースで使う.
次の例は,重複しない品番から書籍情報を抽出する.

session.query(Books).filter(Books.id == 'A123').first()

scalar

scalarは1つの値に決まるケースで使う.
次の例は,ある品番の書籍情報のうち,価格だけを抽出する.

session.query(Books.price).filter(Books.id == 'A123').scalar()

DISTINCT

distinctで重複を取り除くことができる.
次は,1000円以上の書籍の価格のリスト.

session.query(distinct(Books.price)).filter(Books.price >= 1000).all()

ORDER BY・LIMIT

価格が高いものから5件を抽出するなら,order_bylimitを使って次のようにする.

from sqlalchemy import desc

session.query(Books.id, Books.title).filter(Books.price >= 1000).order_by(desc(Books.price)).limit(5)

絞り込み条件(filter)

AND・OR・NOT

and_or_not_を使う.
次は1000円以上でフラグがFalseの書籍を抽出する例.

from sqlalchemy import and_, or_, not_

session.query(Books).filter(
and_(
Books.price >= 1000,
Books.flag = False
)
).all()

LIKE

likeを使う.
次は「ネコ」で始まる書名の書籍を抽出する例.

session.query(Books).filter(Books.title.like("ネコ%").all()

BETWEEN

betweenを使う.
次は価格が1000円から2000円の書籍を抽出する例.

session.query(Books).filter(Books.price.between(1000, 2000)).all()

IN

in_を使う.
次は1000円か1200円の価格である書籍を抽出する.

session.query(Books).filter(Books.price.in_[1000, 1200]).all()

コメント・シェア

SQLAlchemyのCRUD

SQLAlchemyの使用例.

インストール

pipからのインストールは次のようにして行う.

pip install SQLAlchemy

エンジン

接続情報を与える.
次はPostgreSQLに5432ポートで接続する情報の記述例.

from sqlalchemy import create_engine

dialect = "postgresql"
username = "USERNAME"
password = "PASSWORD"
database = "DATABASE"
host = "HOST"
port = "5432"
engine = create_engine(f"{dialect}://{username}:{password}@{host}:{port}/{database}")

セッション

エンジンからセッションを作成する.
withでセッションを使っている間にエラーが生じなければコミット,生じたらロールバックするつもりで予め準備しておく.

from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager

SessionMkr = sessionmaker(engine)

@contextmanager
def Session():
session = SessionMkr()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()

テーブル

データベース処理用のクラスを作って,それを継承する.
ここではBooksというクラスを作り,データベースのbooksというテーブルにアクセスするようにした.
テーブル内の列はColumnで定義する.

from sqlalchemy.orm import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Boolean, Integer, String, Text

Base = declarative_base()

class Books(Base):
__tablename__ = "books"
id = Column(String(7), primary_key=True)
price = Column(Integer)
title = Column(Text)
flag = Column(Boolean)

ここで主キー制約を与えるのにprimary_keyを使用した.
非Null制約にはnullable,一意制約にはuniqueを使う.

追加(SQLのINSERT)

追加したいレコードのインスタンスを作る.

book = Books()
book.id = 'dummyid'
book.title = 'testtitle'

データベースに接続してaddする.

with Session() as session:
session.add(book)

抽出(SQLのSELECT)

レコードの選択をqueryで行い,絞り込んだ上でall等により抽出する.
ここで,filterはSQLのWHERE句に相当する.

セッション.query(取り出したいもの).filter(絞り込み条件).all()

次の例では,1000円以上の書籍の品番と名前を抽出する.

with Session() as session:
data = session.query(Books.id, Books.title).filter(Books.price >= 1000).all()

更新(SQLのUPDATE)

dataに格納したレコードの更新は次のように行う.
次の例では,抽出したレコードについてflag列をTrueに更新する.

with Session() as session:
data = session.query(Books).filter(Books.id == 'A123').first()
data.flag = True

削除(SQLのDELETE)

deleteで削除が実行できる.

with Session() as session:
session.query(Books).filter(Books.id == 'A123').delete()

コメント・シェア

  • page 1 of 1
著者の絵

ねこせんせい

One cat just leads to another.
(Ernest Hemingway)


色鉛筆塗り


校正室