【Python】Python ORM ~ SQLAlchemy / あれこれ編 ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/10/07/133808
https://dk521123.hatenablog.com/entry/2025/10/10/013250

の続き。

今回は、SQLAlchemyのTipsなどをまとめておく

目次

【1】ページネーション
 1)Order By
 2)LIMIT
 3)OFFSET
【2】外部キーがあるテーブルを連結する
【3】検索条件
 1)ilike

【1】ページネーション

session.query(【モデル】)
        .order_by(【モデル】.【項目】.desc())
        .offset(【オフセット数】)
        .limit(【制限数】)
        .all()

1)Order By

* order_by() で指定
* 【モデル】.【項目】.desc() / .asc() で順番指定

サンプル

is_desc = True
order = JobInfo.created_at.desc() if is_desc else JobInfo.created_at.asc()
session.query(JobInfo)
        .order_by(order)
        .all()

2)LIMIT

* limit() で指定

サンプル

JobInfo.created_at.asc()
session.query(JobInfo)
        .limit(5)
        .all()

3)OFFSET

* offset() で指定

サンプル

is_desc = True
order = JobInfo.created_at.desc() if is_desc else JobInfo.created_at.asc()
session.query(JobInfo)
        .order_by(order)
        .offset(6)
        .all()

【2】外部キーがあるテーブルを連結する

* 

https://docs.sqlalchemy.org/en/20/orm/backref.html
サンプル

from sqlalchemy import Column, ForeignKey, BigInteger, Text
from sqlalchemy.orm import DeclarativeBase

# Define table
class Base(DeclarativeBase):
    pass

class Person(Base):
  __tablename__ = "person"
  id = Column(BigInteger, primary_key=True, autoincrement=True)
  name = Column(Text)
  section_id = Column(BigInteger, ForeignKey('section.id'))

class Section(Base):
  __tablename__ = "section"
  id = db.Column(BigInteger, primary_key=True, autoincrement=True)
  name = db.Column(Text)
  
  person = relationship('Person', backref=db.backref('section', lazy=True))

# 以下のような感じで取得する
# person.section_id
# person.section.name 

【3】検索条件

1)ilike

* ilike = insensitive LIKE (大文字小文字を区別しない文字列マッチング)

cf. insensitive = 鈍感な

https://nainaistar.hatenablog.com/entry/insentive-in-sql-alchemy
https://qiita.com/Bashi50/items/7f2214550e80b87fb922

            query = query.filter(
                or_(
                    JobInfo.company_name.ilike(f"%{search.lower()}%"),
                    JobInfo.position.ilike(f"%{search.lower()}%"),
                    JobInfo.location.ilike(f"%{search.lower()}%"),
                )
            )

関連記事

Python ORM ~ SQLAlchemy / 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/07/133808
Python ORM ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2025/10/10/013250
Flask ~ SQLAlchemy / 入門編 ~
https://dk521123.hatenablog.com/entry/2018/09/19/223200
Flask ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2018/09/23/165130