Cassandra 多个连接保存,不工作 [Python]

Posted

技术标签:

【中文标题】Cassandra 多个连接保存,不工作 [Python]【英文标题】:Cassandra multiple connections save, not working [Python] 【发布时间】:2018-04-15 06:19:23 【问题描述】:

我有 2 个 cassandra 集群,我的简单脚本试图从一个集群读取并写入另一个集群。根据文档here,我有一个到第二个集群的registered_connection(命名)和一个到第一个集群的默认连接。我可以使用以下方法查询不同的集群:

item = MyModel.filter(u_id=u_id).using(keyspace=KEYSPACE,connection=connection).first()

但是,当我尝试使用以下方法将项目写入/保存到另一个集群时:

item.using(connection=connection).save()

它不会引发错误,但也不会写入集群。我通过查询接收器集群验证了这一点。我是否遗漏了文档中明显的内容?

PS:在第一个场景中,它的 ModelQuerySet 对象应用自定义连接,而在保存场景中,它的 Model 对象。

【问题讨论】:

【参考方案1】:

对于偶然发现相同问题并需要解决方案的人。 请记住,这是一种解决方法,因此如果此处弹出适当的解决方案,请遵循该解决方案。

此解决方案基于假设

    您正在使用 cassandra-driver==3.11.0 或更低版本,其中连接 支持注册表(看看here) 您有 2 个或更多集群要处理,并且您已通过上述 API (register_connection) 注册了所有命名连接。使连接之一成为默认连接。

关于您的问题的一点背景

当您使用具有不同连接的ModelSetQuery 对象时,它会表现出预期的行为。所以如果你有这样的查询:

MyModel.filter(u_id=u_id).first()

您可以使用using 方法轻松地为此类查询指定keyspaceconnection

MyModel.filter(u_id=u_id).using(keyspace=KEYSPACE, connection=connection).first()

您会发现MyModel.using(connection=connection).save() 不起作用。

对于具有批判性思维的人

您会观察到,在cassandra.cqlengine.query 中的_execute_statement 方法下方,connection 变量为None,即使您使用Model.__connection__ 进行设置,model._get_connection() 也不会获取您的连接名称字符串。只是一个提示,让您开始查看实际问题。

解决方法:将每个集群上的操作组合在一起,然后在每个集群操作切换默认连接到相应集群之前使用connection.set_default_connection("cluster_connection_name")

所以基本上:

connection.set_default_connection("cluster1")
# operations and queries on cluster 1
....
connection.set_default_connection("cluster2")
# operations and queries on cluster 2
....

希望这会有所帮助!

【讨论】:

以上是关于Cassandra 多个连接保存,不工作 [Python]的主要内容,如果未能解决你的问题,请参考以下文章

使用 java 模拟多个用户连接到 Cassandra

presto 可以有多个工作进程吗?

连接 Cassandra NoSQL DB 并将响应作为 JSON 响应获取

Kafka-Connect Cassandra Sink 连接器不将数据推送到 Cassandra

EMR LinkageError 上的 Spark + Cassandra

elasticsearch 如何与cassandra 数据库结合