Кассандра несколько подключений сохраняет, не работает [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 ответ
Для того, кто сталкивается с той же проблемой и нуждается в решении. Пожалуйста, имейте в виду, что это обходной путь, поэтому, если здесь появляется правильное решение, следуйте этому.
Это решение основано на предположении:
- Вы используете cassandra-driver==3.11.0 или ниже, где поддерживается реестр подключений (посмотрите здесь)
- У вас есть 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
....
Надеюсь это поможет!