前提

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

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