用于 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 资源:查询条件缺少关键架构元素