Java 有类似 MyBatis 这样优秀的 ORM 框架,Python 在 Web 开发上则普遍使用 SQLAlchemy,今天就来讲几个非常实用的查询技巧。
like 和 ilike 方法分别可以匹配不区分大小写和区分大小写的关键字。
# like 不区分大小写
User.query.filter(User.name.like("f%{name}%")).all()
# ilike 区分大小写
User.query.filter(User.name.ilike("f%{name}%")).all()
如果使用 PGSQL 需要模糊搜索,则需要安装 pg_trgm 扩展。
create extension pg_trgm
create index trgm_idx_user_name on user using gin (name gin_trgm_ops)
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 用在列表字段包含某个元素时候的查询。
User.query.filter(User.address.any(["中国"])).all()
# 子查询记录
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()