【问题标题】:SQLAlchemy (ORM, declarative): How to build query from key/values in a dict?SQLAlchemy(ORM,声明性):如何从字典中的键/值构建查询?
【发布时间】:2011-07-16 15:52:52
【问题描述】:

使用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'}

是否有任何简单/通用的方法可以从这两个字典创建查询,仅依赖于键与 User 类的属性匹配的事实,同时正确处理类型、自动转义不安全的值等?

我花了几个小时在谷歌上搜索,并浏览 SQLAlchemy 文档,但似乎找不到任何好的答案/示例。

解决方案:

所以,经过你们的帮助,解决方案似乎很简单:

User.query.filter_by(**q1_dict)

User.query.filter_by(**q2_dict)

...获取示例中所需的两个查询。

我已经查看了您提供的链接,dagoof,但我想我的“python”还不够强大,无法靠我自己找到解决方案。 :)

【问题讨论】:

  • 您想按 name='...' AND email='...' 查询?

标签: python sqlalchemy declarative


【解决方案1】:

试试下面的,参考这里:Query, filter_by

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

【讨论】:

    【解决方案2】:

    一些示例代码:

    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_() 创建一个 AND 条件并将单个表达式添加到条件中......

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多