简体   繁体   English

如何在 Python 中正确序列化和反序列化 paging_size?

[英]How to properly serialize and deserialize paging_size in Python?

In my Python application, I make the query to the Cassandra database.在我的Python应用程序中,我对Cassandra数据库进行了查询。 I'm trying to implement pagination through the cassandra-driver package.我正在尝试通过cassandra-driver包实现分页。 As you can see from the code below, paging_state returns the bytes data type.从下面的代码中可以看出, paging_state返回bytes数据类型。 I can convert this value to the string data type.我可以将此值转换为string数据类型。 Then I send the value of the str_paging_state variable to the client.然后我将str_paging_state变量的值发送给客户端。 If this client sends me str_paging_state again I want to use it in my query.如果此客户端再次向我发送str_paging_state ,我想在查询中使用它。

This part of code works:这部分代码有效:

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'"

This part of code raise error:这部分代码引发错误:

results = session.execute(
    statement,
    paging_state=bytes(str_paging_state.encode())
)

Error :错误

[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

In Java documentation I found the .fromString method which creates a PagingState object from a string previously generated with toString() .在 Java 文档中,我找到了.fromString方法,该方法从先前使用toString()生成的字符串创建PagingState对象。 Unfortunately, I didn't find an equivalent for this method in Python.不幸的是,我没有在 Python 中找到与此方法等效的方法。

I also tried to use codecs package to decode and encode the paging_state .我还尝试使用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'))

In this case I see next error :在这种情况下,我看到下一个错误

[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

In my case, protocol version is 4.就我而言, 协议版本是 4。

cluster = Cluster(..., protocol_version=4)

I would appreciate any help!我将不胜感激任何帮助!

In my Python application, I make the query to the Cassandra database.在我的Python应用程序中,我对Cassandra数据库进行了查询。 I'm trying to implement pagination through the cassandra-driver package.我正在尝试通过cassandra-driver包实现分页。 As you can see from the code below, paging_state returns the bytes data type.从下面的代码中可以看出, paging_state返回bytes数据类型。 I can convert this value to the string data type.我可以将此值转换为string数据类型。 Then I send the value of the str_paging_state variable to the client.然后我将str_paging_state变量的值发送给客户端。 If this client sends me str_paging_state again I want to use it in my query.如果此客户端再次向我发送str_paging_state ,我想在查询中使用它。

This part of code works:这部分代码有效:

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'"

This part of code raise error:这部分代码引发错误:

results = session.execute(
    statement,
    paging_state=bytes(str_paging_state.encode())
)

Error :错误

[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

In Java documentation I found the .fromString method which creates a PagingState object from a string previously generated with toString() .在 Java 文档中,我找到了.fromString方法,该方法从先前使用toString()生成的字符串创建PagingState对象。 Unfortunately, I didn't find an equivalent for this method in Python.不幸的是,我没有在 Python 中找到与此方法等效的方法。

I also tried to use codecs package to decode and encode the paging_state .我还尝试使用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'))

In this case I see next error :在这种情况下,我看到下一个错误

[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

In my case, protocol version is 4.就我而言, 协议版本是 4。

cluster = Cluster(..., protocol_version=4)

I would appreciate any help!我将不胜感激任何帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM