【问题标题】:django cassandra not executing select query with where clause for datetime rangedjango cassandra 不使用日期时间范围的 where 子句执行选择查询
【发布时间】:2020-06-29 14:11:17
【问题描述】:

我在 cassandra 中有数据,我正在尝试从日期时间范围内的数据库中获取数据。

下面是代码。

fromdate = datetime.combine(dt, datetime.min.time())
todate = datetime.combine(datetime.now().date(), time(23, 59, 59))
print(fromdate)
print(todate)

batch = BatchStatement()
batch.add(SimpleStatement("SELECT * FROM datadump WHERE 'pickup_time' >= '%s' AND 'pickup_time' <= '%s' ALLOW FILTERING;"),
              (fromdate, todate,))
data = session.execute(batch)

当我尝试在日期时间范围内获取数据时,上面的代码不起作用,但如果我尝试获取所有数据,例如“SELECT * from datadump”,它就可以工作。

有人可以告诉我上述方法有什么问题吗?

提前致谢!

【问题讨论】:

  • 好吧,我看到ALLOW FILTERING 这通常是“错误的”。 pickup_time 是集群键吗?如果是这样,请尝试指定它前面定义的所有键,尤其是分区键。
  • @Aaron,感谢您的回复。 Pickup_time 是数据库中的列名。
  • 所以根本就不是钥匙?这绝对是个问题。此外,亚历克斯在他的回答中提出了一个很好的观点。在 Cassandra 中使用带有 SELECT 的批处理没有任何意义。
  • 好的,我直接在 RazorSQL 中执行了这个查询并得到了输出。 SELECT * FROM datadump WHERE 'pickup_time' >= '2020-03-18 00:00:00' AND 'pickup_time' = '%s' AND 'pickup_time'

标签: python django cassandra


【解决方案1】:

您不能在批处理语句中使用SELECT - 它仅适用于INSERT/UPDATE/DELETE...

另外,请注意 CQL 中的 BATCH 与 SQL 中的不同,您需要知道什么时候使用它,什么时候不使用它 - 请参考the documentation on how & when to use it

【讨论】:

  • 感谢您的回复。所以我必须准备语句然后执行它。像这样的东西? stateMent = session.prepare("SELECT * FROM datadump WHERE 'pickup_time' >= '%s' AND 'pickup_time'
  • 如果只是一次执行,那么带有prepare的版本会很慢,因为查询需要发送到服务器进行分析。但是如果你经常这样做,那么你需要准备查询 - 它会更有效
  • 但实际上,您需要花一些时间来学习 Cassandra 的工作原理,以及如何构建有效的数据模型。例如,您只能对集群列使用范围查询,并且只能使用分区键的规范。我建议在academy.datastax.com上观看 DS201 和 DS220 课程
  • 好的,我会开始的 :) 非常感谢 Alex。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2017-01-11
  • 1970-01-01
  • 2014-11-11
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多