python-3.x - 用于 DynamoDB 查询的 Python 代码适用于 v3.6,但不适用于 python 2.7
问题描述
我有一个带有 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'
解决方案
我认为“无属性 log_exception”是 Tornado 5 中的一个错误,已在 Tornado 6 中修复。但是,Tornado 6 只支持 Python 3,所以在 Python 2 中你会得到旧版本。
这里还有另一个错误,但你看不到它是什么,因为 Python 2 的错误处理不如 Python 3 好。并且该错误显然不会在 Python 3 上发生。如果您必须继续支持 Python 2,请尝试try/except
在回调的主体周围添加一个块on_message
(或使用read_message
接口而不是on_message
回调)。
推荐阅读
- python - 为什么我在尝试引用 cv2、inutils 等时得到一个名为:___ 错误的无模块
- r - 如何在 tidyverse 中滚动计算?
- python - 如何设置 tkinter 'textvariable',在单独的线程中运行,来自主线程的队列中的值?
- java - 为 Swagger DTO 对象提供默认值
- javascript - 用户输入和 toFixed 方法不起作用
- rust - 一次不能多次借用 `reader` 作为 mutable
- python - 如何通过 python 中我的不和谐机器人的单独函数发送消息?
- c# - 将内存流转换为数组,但只取指定数量的元素
- c# - 添加新项目时列表重置(编辑标题以反映实际问题)
- cmake - cmake:当有d后缀进行调试时如何链接dll