sqlalchemy的优雅:不定字段、不定长查询

一、不特定字段查询

假设 TbUser 为一个表模型,session 为与数据库的会话

一个普通的查询大概是这个样:

session.query(TbUser).filter(TbUser.name=="xiaokeai")

这是为已知要查 TbUser 内的 name 字段而设计的查询,有这么一个需求,查某一个字段里面包含有字母 y 的条目,出现了对未知字段的描述。

__dict__魔术方法:返回类的属性与属性值 item,类型为字典。在 sqlalchemy 的模型中每一个正常的字段属性对应值均为字段对象,等待在被 query 查询时实例化。

# 一个模型的 __dict__ 参考
mappingproxy({'__module__': '__main__',
              '__tablename__': 'tb_user',
              'id': <sqlalchemy.orm.attributes.InstrumentedAttribute at 0x638c5e8>,
              'name': <sqlalchemy.orm.attributes.InstrumentedAttribute at 0x638c6a8>,
              ...以下省略...
              })

利用 __dict__来实现不特定字段

col_name = "xxx"

# 查询某个字段包含有 xx 的 , 这个字段可能是任何一个字段
session.query(TbUser).filter(TbUser.__dict__[col_name].like("%y%"))
# 亦或者查询某个字段值等于 xx
session.query(TbUser).filter(TbUser.__dict__[col_name]=="xx")

二、不特定长度查询

session.query(TbUser).filter()  这是一条普通的过滤查询,实际上在 filter 内的所有条件都是一个对象,用一个 list 装所有的查询条件对象。

filters = [
	TbUser.name.like("y"),	# 加一个包含y条件
	TbUser.xx=="test"		# 加一个值等于test的条件
]

# 可以直接对过滤条件解包
session.query(TbUser).filter(*filters)

and_, or_ 的增加示例

# 查询同时满足有filters内条件的
session.query(TblSymp).filter(and_(*filters),)

# 查询同时满足filters条件的 或者满足 filters2 条件的
session.query(TbUser).filter(or_(and_(*filters), *filters2))

我是庸了个白,你的点赞将是我更新的最大动力。

你可能感兴趣的:(sqlchemy的优雅)