0

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

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

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

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

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

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

4

1 回答 1

0

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

该解决方案基于以下假设

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

关于您的问题的一点背景:

当您使用ModelSetQuery具有不同连接的对象时,它会表现出预期的行为。因此,如果您有如下查询:

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

您可以使用以下方法轻松地为此类查询指定keyspace和:connectionusing

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

您会观察到这MyModel.using(connection=connection).save()不起作用。

对于批判性思维

您将观察到 under_execute_statement方法 incassandra.cqlengine.query具有connection变量 asNone并且即使您设置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
....

希望这可以帮助!

于 2017-11-03T08:46:55.710 回答