我正在将NodeJS后端移到Python3.6。
在NodeJS中,我能够使用aws SDK在两个日期之间获取项目,如下所示:
```
var now = moment().tz("Pacific/Auckland").format()
var yesterday = moment().add(-24,"Hours").tz("Pacific/Auckland").format()
var docClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName : process.env.TableName,
FilterExpression : '#ts between :val1 and :val2',
ExpressionAttributeNames: {
"#ts": "timeStamp",
},
ExpressionAttributeValues: {
':val1': yesterday,
':val2': now
}
}
```
这样可以正常工作,但是boto3中的between函数似乎没有做同样的事情。
这是我用来尝试获得类似内容的当前代码:
```
import boto3
import time
from datetime import datetime, timedelta
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('table_name')
now = int(datetime.timestamp(datetime.now()))
three_hours_ago = int(datetime.timestamp(datetime.now() - timedelta(hours=3)))
fe = Key('timeStamp').between(three_hours_ago,now);
response = table.scan(
FilterExpression=fe
)
print(response)
```
这不返回任何项目,我确信这两个日期之间有项目。
非常感谢任何帮助。
答案 0 :(得分:5)
我设法使用以下代码解决了这个问题:
now = datetime.datetime.now()
three_hours_ago = now - datetime.timedelta(hours=3)
# TODO make the db UTC
now = now.strftime('%FT%T+13:00')
three_hours_ago = three_hours_ago.strftime('%FT%T+13:00')
fe = Key('timeStamp').between(three_hours_ago,now);
response = table.scan(
FilterExpression=fe
)
答案 1 :(得分:0)
可能的解决方案可能是:
attr = boto3.dynamodb.conditions.Attr('timeStamp')
response = table.scan(
FilterExpression=attr.between(first_date,second_date)
)
但是,请注意,日期格式应为YYYY-MM-DD(ISO 8601)