在sqlalchemy中查询时如何处理字典构造中的多个参数?

时间:2013-05-07 01:46:46

标签: python-2.7 sqlalchemy

在sqlalchemy中,我定义了一个函数,其参数是一个字典可能包含多个键值。我想根据键值进行查询。这是我的计划:

def get_contact_conditions(kwds):
    for fieldName, fieldValue in kwds.items():
        condition = fieldName + "=:fieldName"
        contact = session.query(Contact).filter(condition).params(fieldName = fieldValue).all()
        session.commit()
        return contact

上面这种情况是当字典只有一个键值,但可能有两个或三个,那么如何编码条件和params()中的值。换句话说,如何编码查询子句。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您需要的唯一比较是“=”,那么这应该有效:

def get_contact_conditions(kwds):
    contact = session.query(Contact).filter_by(**kwds).all()
    return contact

你可以在这里阅读:

http://docs.sqlalchemy.org/en/rel_0_7/orm/query.html#sqlalchemy.orm.query.Query.filter_by

如果您需要任意运算符(<,>,in_,like等),您可以将sqlalchemy子句列表作为参数传递给and_函数,并将结果传递给filter()。将模型类属性与某些内容进行比较时会生成这些表达式,例如:

Contact.id < 5

所以你可以这样做:

from sqlalchemy.sql import and_

def get_contacts(*exps):
    return session.query(Contact).filter(and_(*exps)).all()

# All contacts with an id less than 5 and a name that starts with user.
contacts = get_contacts(Contact.id < 5, Contact.name.like('user%'))

但是你应该考虑到这一点,函数越来越接近直接调用session.query。

您应该更多地阅读sqlalchemy文档,以了解模型列/关系中可用的运算符/比较。有一些非常有用的。