用于 DynamoDB 查询的 Python 代码适用于 v3.6,但不适用于 python 2.7

Posted

技术标签:

【中文标题】用于 DynamoDB 查询的 Python 代码适用于 v3.6,但不适用于 python 2.7【英文标题】:Python code for DynamoDB query is working on v3.6 but not working in python 2.7 【发布时间】:2019-03-30 00:46:22 【问题描述】:

我有一个带有 boto3 框架的 DynamoDB 查询,它适用于运行 Python 3.6 的本地计算机,但不适用于运行 Python 2.7 的服务器。

我本地机器上的工作代码:

dyndb = boto3.resource('dynamodb')
table = dyndb.Table('XXXXXXX')

response = table.query(
      IndexName = "XXX-XXX-index",
      ProjectionExpression = "AssessID,SNo,Details,Status,OTP",
      KeyConditionExpression = Key('OTP').eq(otp))

服务器上运行的代码...

    global user_otp

         dyndb = boto3.resource('dynamodb')
         table = dyndb.Table('XXXXXX')

         otp = int(user_otp)

         print("converting string otp to int otp") # it is printed on console
         response = table.query(
                 IndexName = "XXX-XXX-index",
                 ProjectionExpression = "AssessID,SNo,Details,Status,OTP",
                 KeyConditionExpression = Key('OTP').eq(otp) & Key('SNo').between(1,5))

         print ("response code is executing file") # it is not printed on console

当我打印输出时,会显示第一次打印,但不会在表查询之后显示第二次打印。

我正在使用OTP 作为分区键和SNo 作为排序键对全局索引进行此查询。我在本地机器上只使用分区键得到结果,但在我的服务器上却没有,即使同时使用分区键和排序键。

DynamoDB 不会引发任何异常。相反,我得到了龙卷风 websocket 异常。

control coming to process and response function
user otp mentioned is  3086and its type <type 'int'>
converting string otp to int otp

ERROR:tornado.application:Exception in callback <functools.partial object at 0x7f33b6ce7890>
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/tornado/ioloop.py", line 758, in _run_callback
    ret = callback()
  File "/usr/lib64/python2.7/site-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib64/python2.7/site-packages/tornado/ioloop.py", line 779, in _discard_future_result
    future.result()
  File "/usr/lib64/python2.7/site-packages/tornado/concurrent.py", line 261, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1141, in run
    yielded = self.gen.throw(*exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 888, in _receive_frame_loop
    yield self._receive_frame()
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1133, in run
    value = future.result()
  File "/usr/lib64/python2.7/site-packages/tornado/concurrent.py", line 261, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1147, in run
    yielded = self.gen.send(value)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 975, in _receive_frame
    handled_future = self._handle_message(opcode, data)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 1000, in _handle_message
    return self._run_callback(self.handler.on_message, decoded)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 548, in _run_callback
    self.handler.log_exception(*sys.exc_info())
AttributeError: 'WebSocketClientConnection' object has no attribute 'log_exception'

【问题讨论】:

我使用 python 2.7 从同一服务器运行了相同的 dynadmodb 代码。它正在获取记录。所以它不是 dynamodb 查询的问题。从 websocket 端挖掘更多......我是 websockets 的新手。但我会一直在这里发布。注意:我只运行了 dynamodb 查询作为单独的 python 文件进行测试。 【参考方案1】:

我认为“无属性 log_exception”是 Tornado 5 中的一个错误,在 Tornado 6 中已修复。但是,Tornado 6 仅支持 Python 3,因此在 Python 2 中您将获得旧版本。

这里还有另一个错误,但是你看不到它是什么,因为 Python 2 的错误处理不如 Python 3 好。并且该错误显然不会在 Python 3 上发生。如果您必须继续支持 Python 2,请尝试在 on_message 回调的主体周围添加 try/except 块(或使用 read_message 接口而不是 @987654324 @回调)。

【讨论】:

以上是关于用于 DynamoDB 查询的 Python 代码适用于 v3.6,但不适用于 python 2.7的主要内容,如果未能解决你的问题,请参考以下文章

用于查询 dynamodb 的 boto3 资源:查询条件缺少关键架构元素

用于 url 和相关关键字的 DynamoDB 数据模型

使用全局二级索引的 DynamoDB 表查询项

DynamoDB Appsync 查询多个属性

Amazon DynamoDB 是不是支持查询结果的流式传输

用于独立游戏后端的 Aurora、Redshift 和 DynamoDB?