Cassandra多个连接保存,无法正常工作[Python]

时间:2017-11-02 16:26:09

标签: python cassandra cassandra-python-driver

我有两个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 个答案:

答案 0 :(得分:0)

对于遇到同样问题并需要解决方案的人。 请记住这是一个解决方法,所以如果在这里弹出一个正确的解决方案,请遵循这一点。

此解决方案基于假设

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

    当您使用具有不同连接的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()不起作用。

    对于批判性的

    您会发现_execute_statement中的cassandra.cqlengine.query方法下方的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
    ....
    

    希望这有帮助!