问题描述
在我的Python
应用程序中,我查询到Cassandra
数据库。我正在尝试通过cassandra-driver包实现分页。从下面的代码中可以看到,paging_state
返回bytes
数据类型。我可以将此值转换为string
数据类型。然后,我将str_paging_state
变量的值发送给客户端。如果此客户再次向我发送str_paging_state
,我想在查询中使用它。
这部分代码有效:
query = "select * from users where user_type = 'clients';"
statement = SimpleStatement(query,fetch_size=10)
results = session.execute(statement)
paging_state = results.paging_state
print(type(paging_state)) # <class 'bytes'>
str_paging_state = str(paging_state)
print(str_paging_state) # "b'\\x00C\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x03_hk\\x00\\x00\\x00\\x11P]5C#\\x8bGD~\\x8b\\xc7g\\xda\\xe5rH\\xb0\\x00\\x00\\x00\\x03_rk\\x00\\x00\\x00\\x18\\xee\\x14\\xf7\\x83\\x84\\x00tTmw[\\x00\\xec\\xdb\\x9b\\xa9\\xfd\\x00\\xb9\\xff\\xff\\xff\\xff\\xfe\\x01\\x00'"
results = session.execute(
statement,paging_state=bytes(str_paging_state.encode())
)
错误:
[ERROR] NoHostAvailable: ('Unable to complete the operation against any hosts')
Traceback (most recent call last):
File "/var/task/lambda_function.py",line 51,in lambda_handler
results = cassandra_connection.execute(statement,paging_state=bytes(paging_state.encode()))
File "/opt/python/lib/python3.8/site-packages/cassandra/cluster.py",line 2618,in execute
return self.execute_async(query,parameters,trace,custom_payload,timeout,execution_profile,paging_state,host,execute_as).result()
File "/opt/python/lib/python3.8/site-packages/cassandra/cluster.py",line 4877,in result
raise self._final_exceptionEND RequestId: 4b7bf588-a2d2-45e5-ad7e-8611f1704313
在Java documentation中,我发现了.fromString
方法,该方法从以前用PagingState
生成的字符串中创建了toString()
对象。不幸的是,我在Python中找不到该方法的等效项。
我还尝试使用codecs包对paging_state
进行解码和编码。
str_paging_state = codecs.decode(paging_state,encoding='utf-8',errors='ignore')
# "\u0000C\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0003_hk\u0000\u0000\u0000\u0011P]5C#GD~grH\u0000\u0000\u0000\u0003_rk\u0000\u0000\u0000\u0018\u0014\u0000tTmw[\u0000ۛ\u0000\u0001\u0000"
# Raise error
results = session.execute(statement,paging_state=codecs.encode(str_paging_state,errors='ignore'))
[ERROR] ProtocolException: <Error from server: code=000a [Protocol error] message="Invalid value for the paging state">
Traceback (most recent call last):
File "/var/task/lambda_function.py",line 50,in lambda_handler
results = cassandra_connection.execute(
File "/opt/python/lib/python3.8/site-packages/cassandra/cluster.py",in result
raise self._final_exceptionEND RequestId: 979f098a-a566-4904-821a-2ce06522d909
就我而言,protocol version是4。
cluster = Cluster(...,protocol_version=4)
我将不胜感激!
解决方法
只需将二进制数据转换为十六进制字符串或base64-为此请使用binascii
module。例如,对于第一种情况,函数hexlify / unhexlify(或在Python 3中使用二进制数据的.hex
方法),对于base64-使用函数b2a_base64
/ a2b_base64