python - 如何使用 Python3 在 CQL 中准备 SELECT 查询?

标签 python python-3.x cassandra cql

就像我可以准备 INSERT 查询一样,如何在 CQL-Python 中准备 SELECT 查询? 插入语句:

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

最佳答案

Cassandra 似乎不支持 !=SELECT

在这里检查: https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html

您必须编写不带 != 的查询并管理代码中的逻辑。

关于python - 如何使用 Python3 在 CQL 中准备 SELECT 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54267619/

相关文章:

python - 返回多个函数的装饰器

python - 我如何知道 .npz 文件是否已压缩?

python - 缓存磁盘操作

python - python打印函数的问题

python - 比较列表中元组的元素

scala - spark-shell 依赖项,从 sbt 翻译

Docker 容器重启不丢失数据

python - 装饰 Python 的内置 print() 函数

python - 使用搜索和调用 next() 读取文件时有没有办法返回?

cassandra - Cassandra和Java 9-ThreadPriorityPolicy = 42超出允许范围