无法对 DjangoCassandraModel 中的分区进行排序,"ORDER BY is only supported when the partition key is restricted by an EQ or an IN."

Cannot sort partitions in DjangoCassandraModel, "ORDER BY is only supported when the partition key is restricted by an EQ or an IN."

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: Error from server: code=2200 [Invalid query] message="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."

您好。我在 Cassandra 中创建了动态 Django 模型。 (时间,价值)测量。如何根据时间(主键)获取table中的最后一个元素?我的实现有错误。

如错误消息所述,ORDER BY 子句仅在您对 单个分区内的行 进行排序时才有效,特别是当 "the分区键受限.

在您的情况下,您正在执行完整的 table 扫描(没有 WHERE 子句),因为分区键 未限制 到单个分区:

SELECT * FROM ... ORDER BY time DESC LIMIT 1

您不能根据分区键 time 进行排序,因为这意味着 Cassandra 必须从 所有节点 检索 所有分区 以便按降序对它们进行排序。

您只能对聚簇列进行排序。例如,如果您有 table 个 phone 个数字:

CREATE TABLE phone_numbers_by_username (
  username text,
  phone_type text,
  phone_number text,
  PRIMARY KEY (username, phone_type)
)

如果将查询限制在单个分区 (username),则可以按 phone 类型(家庭、移动、工作)排序:

SELECT * FROM phone_numbers_by_username
  WHERE username = ?
  ORDER BY phone_type DESC

但是,这在您的情况下是不可能的,因为您的 table 中的每个分区只有一行(PRIMARY KEY 中没有聚集列)。干杯!