SQLAlchemy的实用技巧

Updated on in Python with 0 views and 0 comments

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