Как подготовить запрос SELECT на CQL с использованием Python3? - PullRequest
0 голосов
/ 19 января 2019

Как я могу подготовить INSERT запрос, как я могу подготовить SELECT запрос в CQL-Python? ВСТАВИТЬ утверждение:

insert_sql = self.session.prepare(
            (
                "INSERT INTO  {} ({}, {}, {}) VALUES (?,?,?)"
            ).format(
                self.table_name, "id", "version", "row"
            )
        )

И выполнить его с:

params = (key, "version_1", row, )
                futures.append(
                    (
                        insert_sql,
                        params
                    )
                )
            # Checking whether the formed keys already exists
            results = execute_concurrent(
                self.session, futures, concurrency=1000, raise_on_first_error=False
            )

Когда я делаю то же самое с SELECT:

select_sql = self.session.prepare(
            (
                "SELECT * FROM {} WHERE {}=%s AND {}=%s AND {}!=%s"
            ).format(
                self.table_name, "id", "version", "row"
            )
        )

И выполнить его с:

params = (key, "version_1", row, )
                futures.append(
                    (
                        select_sql,
                        params
                    )
                )
            # Checking whether the formed keys already exists
            results = execute_concurrent(
                self.session, futures, concurrency=1000, raise_on_first_error=False
            )

У меня ошибка:

cassandra.InvalidRequest: Error from server: code=2200 [Invalid query] message="Unsupported "!=" relation: row != ?"
Traceback (most recent call last):
  File "getting_started.py", line 145, in <module>
    example1.insert_data()
  File "getting_started.py", line 97, in insert_data
    self.table_name, "id", "version", "row"
  File "cassandra/cluster.py", line 2405, in cassandra.cluster.Session.prepare
  File "cassandra/cluster.py", line 2402, in cassandra.cluster.Session.prepare
  File "cassandra/cluster.py", line 4062, in cassandra.cluster.ResponseFuture.result
cassandra.InvalidRequest: Error from server: code=2200 [Invalid query] message="Unsupported "!=" relation: row != ?"

И после изменения != на NOT как в коде:

select_query = (
                "SELECT * FROM {} WHERE {}=%s AND {}=%s AND NOT {}=%s"
            ).format(
                self.table_name, "id", "version", "row"
            )
        print(select_query)
        select_sql = self.session.prepare(
            select_query
        )
        for df in chunks:
            futures = []
            df = df.to_dict(orient='records')
            chunk_counter += 1
            for row in df:
                key = str(row["0"])
                row = json.dumps(row, default=str)
                params = (key, "version_1", row, )
                futures.append(
                    (
                        select_sql,
                        params
                    )
                )
            # Checking whether the formed keys already exists
            results = execute_concurrent(
                self.session, futures, concurrency=1000, raise_on_first_error=False
            )
            for (success, result) in results:
                if not success:
                    self.handle_error(result)
                print(result)
                sys.exit()
            results = execute_concurrent(
                self.session, futures, concurrency=1000, raise_on_first_error=False)
            for (success, result) in results:
                if not success:
                    self.handle_error(result)  # result will be an Exception
            if (chunk_counter % 1000 == 0):
                self.log.info(
                    "{} 's Batch Insert Completed".format(chunk_counter))
            # print(
            #     str(chunk_counter*chunksize) + " : " +
            #     str(datetime.utcnow() - start_time)
            # )
        print("Complete task's duration is: {}".format(
            datetime.utcnow() - start_time))

Я получаю это:

etting_started.py:8: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from cassandra.cluster import BatchStatement, Cluster
2019-01-19 19:49:16,582 [INFO] root: setting keyspace...
SELECT * FROM TenMillion WHERE id=%s AND version=%s AND NOT row=%s
2019-01-19 19:49:16,590 [ERROR] cassandra.cluster: Error preparing query:
Traceback (most recent call last):
  File "cassandra/cluster.py", line 2402, in cassandra.cluster.Session.prepare
  File "cassandra/cluster.py", line 4062, in cassandra.cluster.ResponseFuture.result
cassandra.protocol.SyntaxException: <Error from server: code=2000 [Syntax error in CQL query] message="line 1:34 no viable alternative at character '%'">
Traceback (most recent call last):
  File "getting_started.py", line 147, in <module>
    example1.insert_data()
  File "getting_started.py", line 100, in insert_data
    select_query
  File "cassandra/cluster.py", line 2405, in cassandra.cluster.Session.prepare
  File "cassandra/cluster.py", line 2402, in cassandra.cluster.Session.prepare
  File "cassandra/cluster.py", line 4062, in cassandra.cluster.ResponseFuture.result
cassandra.protocol.SyntaxException: <Error from server: code=2000 [Syntax error in CQL query] message="line 1:34 no viable alternative at character '%'">

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Ошибка возвращает сообщение = "Unsupported"! = "."! = "Не поддерживается. Попробуйте изменить код SELECT на:

select_sql = self.session.prepare(
            (
                "SELECT * FROM {} WHERE {}=%s AND {}=%s AND NOT {}=%s"
            ).format(
                self.table_name, "id", "version", "row"
            )
        )
0 голосов
/ 19 января 2019

Кассандра, кажется, не поддерживает != с SELECT

Проверьте здесь: https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html

Вам придется написать запрос без != и управлять логикой в ​​вашем коде.

...