如何在 Python 中正确序列化和反序列化 paging_size?
How to properly serialize and deserialize paging_size in Python?
在我的 Python
应用程序中,我查询了 Cassandra
数据库。我正在尝试通过 cassandra-driver 包实现分页。从下面的代码可以看出,paging_state
returns 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
方法,它从先前使用 toString()
生成的字符串创建了一个 PagingState
对象。不幸的是,我没有在 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, encoding='utf-8', 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", 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: 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
在我的 Python
应用程序中,我查询了 Cassandra
数据库。我正在尝试通过 cassandra-driver 包实现分页。从下面的代码可以看出,paging_state
returns 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
方法,它从先前使用 toString()
生成的字符串创建了一个 PagingState
对象。不幸的是,我没有在 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, encoding='utf-8', 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", 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: 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