gpt4 book ai didi

python - 使用 FilterExpression 的 Dynamodb scan()

转载 作者:太空狗 更新时间:2023-10-30 02:39:21 25 4
gpt4 key购买 nike

第一次在 Stack 上发帖,对使用 Python 和 DynamoDB 进行编程还很陌生,但我只是想在我的表上运行扫描,以根据两个预定义的属性返回结果。

---这是我的Python代码片段---

shift = "3rd"
date = "2017-06-21"

if shift != "":
response = table.scan(
FilterExpression=Attr("Date").eq(date) and Attr("Shift").eq(shift)
)

我的 DynamoDB 有 4 个字段。

  1. 身份证
  2. 日期
  3. 转变
  4. 安全

DynamoDB Pic

现在的问题是,在运行时我得到了两个表条目,而我应该只得到第一个条目……根据我的扫描标准,“没有安全问题”的条目。

---这是我的DynamoDB返回结果---

[
{
"Shift": "3rd",
"Safety": "No safety issues",
"Date": "2017-06-21",
"ID": "2"
},
{
"Shift": "3rd",
"Safety": "Cut Finger",
"Date": "2017-06-22",
"ID": "4"
}
]

返回数量:2

我相信通过应用具有逻辑“和”的 FilterExpression 指定扫描操作正在寻找满足两个条件的条目,因为我使用了“和”。

这可能是因为在两个条目中都找到了“shift”属性“3rd”吗?我如何确保它根据满足的两个条件返回条目,而不是只给我一种属性类型的结果?

我觉得这很简单,但我查看了可用的文档:http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Table.scan我仍然有麻烦。任何帮助将不胜感激!

附言我尽量使帖子简单易懂(不包括我所有的程序代码),但是,如果需要其他信息,我可以提供!

最佳答案

这是因为您在表达式中使用了 Python 的 and 关键字,而不是 & 运算符。

如果ab都被认为是Truea和b返回后者, b:

>>> 2 and 3
3

如果其中任何一个为False,或者两个都是,则返回第一个False对象:

>>> 0 and 3
0
>>> 0 and ''
0
>>>

一般规则是,and 返回允许它决定整个表达式真实性的第一个对象。

Python 对象在 bool 上下文中始终被视为 True。所以,你的表达:

Attr("Date").eq(date) and Attr("Shift").eq(shift)

将评估为最后一个 True 对象,即:

Attr("Shift").eq(shift)

这解释了为什么您只在类次上过滤。

您需要使用& 运算符。它通常表示 Python 中整数之间的“按位与”,它被重新定义为 Attr 对象以表示您想要的:“两个条件”。

所以你必须使用“按位与”:

FilterExpression=Attr("Date").eq(date) & Attr("Shift").eq(shift)

根据 the documentation ,

You are also able to chain conditions together using the logical operators: & (and), | (or), and ~ (not).

关于python - 使用 FilterExpression 的 Dynamodb scan(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44704443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com