Python PynamoDB - 使用Flask创建动态查询

时间:2018-01-04 05:13:10

标签: python amazon-dynamodb

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

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中的过滤器,以返回与这两个过滤器匹配记录的结果。

以下适用于单个属性:

>>> query = operator.eq(Test.a, 123)
>>> list(Test.scan(query))
[Test<4426599961>]

我希望能够将其固定在动态数量的属性上(例如,除了a,b和c之外)

我尝试将其转换为元组,但这似乎打破了以下错误:

>>> query = (operator.eq(Test.a, 123), operator.eq(Test.b, 456))
>>> list(Test.scan(*query))

但是我收到以下错误:

Invalid type for parameter Segment, value: b = {'N': '1'}, type: <class 'pynamodb.expressions.condition.Comparison'>, valid types: <type 'int'>, <type 'long'>

关于如何构建动态过滤器以传递到PynamoDB扫描方法的任何想法?

2 个答案:

答案 0 :(得分:0)

你试过了吗?

query = (Test.a == 123) | (Test.b == 456)
list( Test.scan(query))

答案 1 :(得分:0)

怎么样:

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)))