SQLAlchemy 的实用技巧

Updated on in Python with 531 views

Java 有类似 MyBatis 这样优秀的 ORM 框架,Python 在 Web 开发上则普遍使用 SQLAlchemy,今天就来讲几个非常实用的查询技巧。

模糊查询

like、ilike

like 和 ilike 方法分别可以匹配不区分大小写和区分大小写的关键字。

# like 不区分大小写
User.query.filter(User.name.like("f%{name}%")).all()

# ilike 区分大小写
User.query.filter(User.name.ilike("f%{name}%")).all()

pg_trgm 扩展

如果使用 PGSQL 需要模糊搜索,则需要安装 pg_trgm 扩展。

  1. 创建 pg_trgm 扩展 create extension pg_trgm
  2. 使用 pg_trgm 建立 gin 索引 create index trgm_idx_user_name on user using gin (name gin_trgm_ops)

连表查询

join、outerjoin

join 是 SQL 全连接模式,即你连接的表如果字段为空那么这整条记录将不存在;outerjoin 为外连接模式,即如果你连接的表字段为 null,那么该条记录会填充 null 记录。

# join 连接
db.session.query(User, Log).join(Log, Log.user_id == User.id).all()

# outerjoin 连接
db.session.query(User, Log).outerjoin(Log, Log.user_id == User.id).all()

列表查询

any

any 用在列表字段包含某个元素时候的查询。

User.query.filter(User.address.any(["中国"])).all()

子查询

subquery()

# 子查询记录
sub_query = db.session.query(User.id).filter(User.name.like("%Jeffrey%")).order_by(User._time.desc()).limit(10).subquery()

# 需要的查询
data = db.session.query(Grade).filter(Grade.user_id == sub_query.c.id).all()

标题:SQLAlchemy 的实用技巧
作者:Jeffrey

Responses
取消