如何正确设计这个cassandra模型?

时间:2015-07-17 18:15:42

标签: python cassandra cqlengine

我知道标题有点宽泛,但我尝试了一些有不同错误的东西,所以我打算用这个空间来描述它们。我在下面的datastax的python-driver中有一个模型:

class DIDSummary(Model):
    __keyspace__ = 'processor_api'

    did = columns.Text(required=True, primary_key=True, partition_key=True)
    month = columns.DateTime(required=True, primary_key=True, partition_key=True)
    direction = columns.Text(required=True)
    duration = columns.Counter(required=True)
    cost = columns.Counter(required=True)

但是当我尝试这个时:

didsummaries = DIDSummary.filter(did__in=dids, month__in=datetime_range)

我收到此错误:

code=2200 [Invalid query] message="Partition KEY part did cannot be restricted by IN relation (only the last part of the partition key can)"

然后我尝试了这个:

class DIDSummary(Model):
    # ...
    month = columns.DateTime(required=True, primary_key=True)
    # ...

提出错误:

code=2200 [Invalid query] message="Clustering column "month" cannot be restricted by an IN relation"

我也试过这个:

class DIDSummary(Model):
    # ...
    month = columns.DateTime(required=True, primary_key=True, index=True)
    # ...

这给了我这个错误:

InvalidRequest: code=2200 [Invalid query] message="Secondary indexes are not supported on counter tables"

当我尝试sync_table(DIDSummary)

最后,我尝试这样做:

class DIDSummary(Model):
    # ...
    month = columns.DateTime(required=True, primary_key=True)
    direction = columns.Text(required=True)
    # ...

甚至不让我运行服务器,最终在日志中出现此错误:

cassandra.cqlengine.models.ModelDefinitionException: counter models may not have data columns

我应该如何更好地设计这个以便我可以运行上述命令的任何帮助将不胜感激。谢谢!

编辑:我还必须这样做:

didsummaries = DIDSummary.filter(did__in=dids, month=month)

这意味着实际上did必须是我的partition_key的最后一部分。我可以只为每个元素分配一个随机uuid,然后根据primary_keys和索引查找元素吗?那会有用吗?我迷失了。

1 个答案:

答案 0 :(得分:1)

您还需要将方向指向主键。

从Datastax文档:

  

仅在专用表中定义计数器并使用计数器数据   类型。您无法索引,删除或重新添加计数器列。所有   表中的非计数列必须定义为   主键。