SQLAlchemy (ORM, 声明式): 如何根据字典中的键值构建查询?

4 投票
2 回答
3960 浏览
提问于 2025-04-16 21:40

使用SQLAlchemy这个对象关系映射工具(简称ORM),我想知道怎么从一个字典里的条件来编程生成查询。

我想在用户表中查找那些符合之前在字典中收集的标准的记录。我事先不知道会用到哪些字段,而且还需要处理一些字段是整数,有些是字符串,字段种类可能很多等等。

举个例子:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

我们需要两个查询,结果会是以下两个字典:

q1_dict = {'id' : 177}

q2_dict = {'name' : 'Johnny', 'email' : 'johnny@somewhere.com'}

有没有什么简单通用的方法可以从这两个字典创建我的查询呢?只要确保字典的键和用户类的属性匹配,同时正确处理数据类型,自动转义不安全的值等等?

我花了好几个小时在网上查资料,浏览SQLAlchemy的文档,但似乎找不到好的答案或例子。

解决方案:

所以,在你们的帮助下,解决方案似乎简单得多:

User.query.filter_by(**q1_dict)

User.query.filter_by(**q2_dict)

...这样就能得到例子中需要的两个查询。

我之前已经看过你们提供的链接,dagoof,但我想我“python”的水平还不够,没能自己找到解决方案。:)

2 个回答

0

这里有一些示例代码:

100         COND = and_()
.....
216         if hidxs_sg:$
217             clause = [AM.hidx == hidx for hidx in hidxs_sg]$
218             COND.append(or_(*clause))$
....
300         query = session.query(AM).filter(COND)$

关键是要使用 and_() 来创建一个“与”的条件,并把单个的表达式添加到这个条件中……

1

试试下面的内容,这里有一些参考资料:查询按条件过滤

session.query(User).filter_by(**q1_dict)

撰写回答