W aplikacji My {x0}}, wykonuję zapytanie do bazy danych Cassandra. Próbuję wdrożyć paginację przez Pakiet Cassandra-Driver. Jak widać z poniższego kodu, paging_state zwraca typ danych bytes. Mogę konwertować tę wartość do typu danych string. Następnie wysyłam wartość str_paging_state zmiennej do klienta. Jeśli ten klient mnie wysyła str_paging_state, chcę go użyć w moim zapytaniu.

Ta część działa kod:

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

Ta część kodu powoduje błąd:

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

błąd :

[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

W Javie Dokumentacja znalazłem metodę .fromString, która tworzy obiekt PagingState z ciągu wcześniej generowanego z toString(). Niestety, nie znalazłem odpowiednika tej metody w Pythonie.

Próbowałem również użyć Kodeksy pakiet do dekodowania i kodowania {{x0} }.

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

W takim przypadku widzę następny błąd :

[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

W moim przypadku Wersja protokołu jest 4.

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

Byłbym wdzięczny za każdą pomoc!

0
Nurzhan Nogerbek 7 październik 2020, 17:28

1 odpowiedź

Najlepsza odpowiedź

Wystarczy przekonwertować dane binarne do ciągów sznurka lub podstawy64 - Użyj {X0}} Moduł dla tego. Na przykład, dla pierwszego funkcjonowania funkcji Hexlify / Unpexlify (lub w Python 3 Użyj metody danych binarnych .hex Metoda danych binarnych) oraz dla podstawowych64 - Użyj funkcji b2a_base64 / {

1
Alex Ott 7 październik 2020, 15:05