在sqlalchemy python

时间:2016-08-25 06:13:28

标签: python sqlalchemy

我需要使用动态列及其值动态生成/构建sqlalchemy查询。

示例 - 我在SQL中有一个名为“Convo”的表,它有像UserID,ConvoID,ContactID这样的列。

我需要根据以下标准获取行。

criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353))

我为此使用了“Baked query”逻辑。但有些我无法成功运行此查询。

以下是我的代码。

criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353))
baked_query = bakery(lambda session: session.query(tablename))
for key1 in condition:
    baked_query += lambda q: q.filter(tablename.key1 == condition[key1])
    result = baked_query(self.session).all()

我收到错误 -

AttributeError: type object 'Convo' has no attribute 'key1'

请帮我解决这个问题

2 个答案:

答案 0 :(得分:2)

criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353))

query = session.query(tablename)
for _filter, value in criteria:
    query = query.filter(getattr(tablename, _filter) == value)
result = query.all()

答案 1 :(得分:2)

如果您正在使用动态密钥和“简单”相等性检查,则filter_by方法可能更方便,因为它采用与您的属性名称匹配的关键字参数并将其组合到where子句中。

因此,您的迭代查询构造可能如下所示:

baked_query = bakery(lambda session: session.query(tablename))
for key, value in condition.items():
    baked_query += lambda q: q.filter_by(key=value)

另外,由于filter_by采用了多个关键字参数,因此您可以将查询构造简化为单个filter_by调用:

baked_query = bakery(lambda session: session.query(tablename))
baked_query += lambda q: q.filter_by(**condition)

以上所有内容显然假设您的condition变量引用了字典。