如何在cassandra中正确配置和执行batchstatement?

falq053o  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(706)

在我的python(3.8)应用程序中,我通过datastax python驱动程序3.24向cassandra数据库发出请求。
我有几个cql操作,我正试图通过batchstatement执行一个查询,根据官方文档。很遗憾,我的代码导致以下内容出错:

"errorMessage": "retry_policy should implement cassandra.policies.RetryPolicy"
"errorType": "ValueError"

从我的代码中可以看到,我设置了 reply_policy 内部属性 BatchStatement . 不管怎样,我的代码引发了错误,你可以在上面看到。什么样的价值必须在 reply_policy 财产?当前冲突的原因是什么?
代码段:

from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
from cassandra.auth import PlainTextAuthProvider
from cassandra.policies import DCAwareRoundRobinPolicy
from cassandra import ConsistencyLevel
from cassandra.query import dict_factory
from cassandra.query import BatchStatement, SimpleStatement
from cassandra.policies import RetryPolicy

auth_provider = PlainTextAuthProvider(username=db_username, password=db_password)
default_profile = ExecutionProfile(
   load_balancing_policy=DCAwareRoundRobinPolicy(local_dc=db_local_dc),
   consistency_level=ConsistencyLevel.LOCAL_QUORUM,
   request_timeout=60,
   row_factory=dict_factory
)
cluster = Cluster(
   db_host,
   auth_provider=auth_provider,
   port=db_port,
   protocol_version=4,
   connect_timeout=60,
   idle_heartbeat_interval=0,
   execution_profiles={EXEC_PROFILE_DEFAULT: default_profile}
)
session = cluster.connect()

name_1, name_2, name_3  = "Bob", "Jack", "Alex"
age_1, age_2, age_3 = 25, 30, 18

cql_statement = "INSERT INTO users (name, age) VALUES (%s, %s)"

batch = BatchStatement(retry_policy=RetryPolicy)
batch.add(SimpleStatement(cql_statement, (name_1, age_1)))
batch.add(SimpleStatement(cql_statement, (name_2, age_2)))
batch.add(SimpleStatement(cql_statement, (name_3, age_3)))
session.execute(batch)
ct3nt3jp

ct3nt3jp1#

嗯,我终于发现了错误。
我移除了 retry_policy 来自 BatchStatement . 我的错误是我把cql参数放进去了 SimpleStatement .
下面是工作示例代码段:

...
batch = BatchStatement(batch_type=BatchType.UNLOGGED)
batch.add(SimpleStatement(cql_statement), (name_1, age_1))
batch.add(SimpleStatement(cql_statement), (name_2, age_2))
batch.add(SimpleStatement(cql_statement), (name_3, age_3))
session.execute(batch)

编辑时间:
结果,我放弃了 BatchStatement 在这篇文章的底部留下评论之后。我求你注意他们!cql批次与rbdms批次不同。cql批不是一种优化,而是用于跨多个表实现非规范化记录的原子更新。

相关问题