Кассандра несколько подключений сохраняет, не работает [Python]

У меня есть 2 кластера кассандры, мой простой скрипт пытается читать из одного и писать в другой. Согласно документации, у меня есть registered_connection (названный) ко 2-му кластеру и подключение по умолчанию к 1-му кластеру. Я могу запросить различные кластеры, используя:

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

Однако, когда я пытаюсь записать / сохранить элемент в другой кластер, используя:

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

он не выдает ошибки, но также не записывает данные в кластер. Я проверил это, запросив кластер стоков. Я что-то упускаю из документации?

PS: в первом сценарии это ModelQuerySet объект, который применяет пользовательское соединение и в сценарии сохранения его Model объект.

1 ответ

Для того, кто сталкивается с той же проблемой и нуждается в решении. Пожалуйста, имейте в виду, что это обходной путь, поэтому, если здесь появляется правильное решение, следуйте этому.

Это решение основано на предположении:

  1. Вы используете cassandra-driver==3.11.0 или ниже, где поддерживается реестр подключений (посмотрите здесь)
  2. У вас есть 2 или более кластера для обработки, и вы зарегистрировали все именованные соединения через API выше ( register_connection). Сделайте одно из подключений по умолчанию.

Немного предыстории о вашей проблеме:

Когда вы используете ModelSetQuery объект с различными связями, он демонстрирует ожидаемое поведение. Так что если у вас есть запрос вроде:

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

Вы можете легко указать keyspace и connection для такого запроса с using метод:

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
....

Надеюсь это поможет!

Другие вопросы по тегам