首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python使用PynamoDB创建动态查询

Python使用PynamoDB创建动态查询
EN

Stack Overflow用户
提问于 2018-01-04 13:13:10
回答 2查看 1.5K关注 0票数 0

我正在使用PynamoDB,并尝试对来自flask请求的属性进行动态查询/扫描。假设模型如下:

代码语言:javascript
复制
class Test(Model):
    class Meta:
        table_name = "test"
        region = "us-west-2"
    a = NumberAttribute(hash_key=True)
    b = NumberAttribute(range_key=True)
    c = UnicodeAttribute()

我将其绑定到Flask,以便当用户发送带有查询参数的请求时,例如?a=123&b=456,我可以将其转换为PynamoDB中的过滤器,以返回与这两个过滤器匹配的记录的结果。

以下内容适用于单个属性:

代码语言:javascript
复制
>>> query = operator.eq(Test.a, 123)
>>> list(Test.scan(query))
[Test<4426599961>]

我希望能够将其添加到动态数量的属性上(例如,超越a、b和c)

我尝试将其转换为元组,但似乎与以下错误相冲突:

代码语言:javascript
复制
>>> query = (operator.eq(Test.a, 123), operator.eq(Test.b, 456))
>>> list(Test.scan(*query))

但我得到以下错误:

代码语言:javascript
复制
Invalid type for parameter Segment, value: b = {'N': '1'}, type: <class 'pynamodb.expressions.condition.Comparison'>, valid types: <type 'int'>, <type 'long'>

关于如何构造一个动态过滤器以传递到PynamoDB扫描方法,您有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-17 07:45:54

这样如何:

代码语言:javascript
复制
q = { 'a': 123, 'b': 456 }

query = None
for fieldname in q:
    field = getattr(Test, fieldname, None)
    if field is None: continue
    clause = field == q[fieldname]
    query = clause if query is None else query & clause

print(list(Test.scan(cond)))    
票数 2
EN

Stack Overflow用户

发布于 2018-03-02 01:55:59

您是否尝试过:

代码语言:javascript
复制
query = (Test.a == 123) | (Test.b == 456)
list( Test.scan(query))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48089051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档