无法对 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
中没有聚集列)。干杯!
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
中没有聚集列)。干杯!