Django cassandra engine get last item
from cassandra.cqlengine import columns
from django_cassandra_engine.models import DjangoCassandraModel
from django.db import connections
def get_tag(car_name, car_type):
class Tag(DjangoCassandraModel):
__table_name__ = car_name + "_" + car_type
time = columns.Integer(primary_key=True, required=True) # unix time in seconds # noqa
value = columns.Float(required=True)
with connections['cassandra'].cursor() as cursor:
cursor.execute("CREATE TABLE IF NOT EXISTS mydatabase." + __table_name__ + " (time INT PRIMARY KEY, value FLOAT);") # noqa
def last():
with connections['cassandra'].cursor() as cursor:
elem = cursor.execute("SELECT * FROM " + Tag.__table_name__ + " ORDER BY time DESC LIMIT 1;") # noqa
return elem
def __str__(self) -> str:
return str(self.time) + "," + str(self.value)
return Tag
Использование в коде:
tag = get_tag(car_name, car_type)
last_elem = tag.last()
Произошла ошибка при вызове tag.last()
:
cassandra.InvalidRequest: Ошибка от сервера: code=2200 [Неверный запрос] message="ORDER BY поддерживается только в том случае, если ключ раздела ограничен эквалайзером или IN."
Здравствуйте. У меня есть создание динамической модели Django в Cassandra. (время, значение) измерения. Как получить последний элемент в таблице на основе времени (первичный ключ)? Моя реализация имеет ошибку.
Как говорится в сообщении об ошибке, предложение ORDER BY
работает только тогда, когда вы сортируете строки внутри одного раздела, в частности, когда "ключ раздела ограничен".
В вашем случае вы выполняете полное сканирование таблицы (без предложения WHERE
), поскольку ключ раздела не ограничен одним разделом:
SELECT * FROM ... ORDER BY time DESC LIMIT 1
Вы не можете сортировать на основе ключа раздела time
, поскольку это означает, что Cassandra должна получить все разделы из всех узлов , чтобы отсортировать их в порядке убывания.
Вы можете сортировать только по столбцу кластеризации. Например, если у вас есть таблица телефонных номеров:
CREATE TABLE phone_numbers_by_username (
username text,
phone_type text,
phone_number text,
PRIMARY KEY (username, phone_type)
)
Затем вы можете сортировать по типу телефона (домашний, мобильный, рабочий), если вы ограничите запрос одним разделом (username
):
SELECT * FROM phone_numbers_by_username
WHERE username = ?
ORDER BY phone_type DESC
Однако в вашем случае это невозможно, поскольку каждый раздел в вашей таблице имеет только одну строку (нет столбцов кластеризации в PRIMARY KEY
). Будьте здоровы!