按数据存储区API中的范围过滤

时间:2014-06-13 13:39:07

标签: ckan

http://docs.ckan.org/en/ckan-2.2/datastore.html处的数据存储区API文档介绍了“datastore_delete”或“datastore_search”等方法如何包含“过滤器”参数来过滤结果。

  

filters(字典) - 删除前应用的过滤器(例如{“name”:   “弗雷德”})。如果缺少删除整个表和所有相关视图。   (可选)

考虑到{"name": "fred"}示例,似乎过滤基于完全匹​​配。但是,是否也可以指定范围,例如得到的结果大于/小于给定值?

例如,如果我有一个名为“date”的字段的数据存储,其值从“2014-06-12T12:03:10.052000”(最旧)到“2014-06-12T16:08:39.542000”(最新)在我的记录中,我如何获得例如2014-06-12T14:00:00之前的记录或2014-06-12T15:00:00更新的记录?

欢迎任何文档示例或指针。谢谢!

2 个答案:

答案 0 :(得分:3)

答案是,从CKAN 2.2开始,这是不可能的。 datastore_delete和datastore_search操作仅采用“field = value”类型的过滤器。

对于datastore_search,还有一个替代方法:datastore_search_sql,它允许您提供自己的SQL查询,从而实现范围搜索。 (我认为限制是这只适用于公共数据集,并且需要一个只读数据库用户,CKAN仅支持Postgres 9.1 +)。

目前正在开发一个实验性分支1725,它将允许插件扩展数据存储区运行的SQL查询。这将允许插件实现新类型的过滤器,例如范围。如果您是开发人员,您可能想尝试该分支。

答案 1 :(得分:0)

诀窍是标记值,以便过滤器可立即捕获您希望删除的所有值。

  • 首先通过CKAN API通过SQL查询下载您要删除的数据。
  • 然后,将该数据中的两列更改为相同的高度可识别的数字,以使这些值在整个表中永远找不到。
  • 接下来,使用“ update”方法通过“ datastore_upsert”更新数据,以确保您不会以某种方式将新数据添加到表中。
  • 最后,用一个过滤器实现“ datastore_delete”,该过滤器用该高度可识别的数字标识两个列。

以下是过滤器的示例:

filter = {"col1": 9876543210, "col2": 9876543210}