使用SODA API删除数据集中的所有行

时间:2015-01-08 22:30:11

标签: python json rest put socrata

我正在尝试使用SODA API以编程方式删除Socrata数据集中的所有行。我不想删除数据集本身,因为那时我有很多工作要重建它。对于成千上万行来说,这也很慢。

以前,我在每一行上缓慢迭代,删除每一行,直到someone on Twitter,建议做一个没有行的Upsert。我相信我实现了它并且它有效,但现在它没有。

以下是相关的代码:

headers = {'X-App-Token': config.app_token}
headers['Content-Type'] = 'application/json'

r = requests.put(config.dataset + '.json', data='[ ]', headers=headers, auth=config.auth)
print r.status_code, r.text

输出结果为:

200 {
  "By RowIdentifier" : 0,
  "Rows Updated" : 0,
  "Rows Deleted" : 0,
  "Rows Created" : 0,
  "Errors" : 0,
  "By SID" : 0
}

(所以我认为可以说这个问题与身份验证,授权等无关?我的其他函数可以很好地处理行,所以对于错误的数据集URL或任何东西也不是问题。)< / p>

我还查询之前和之后的行数,并且没有变化。还有数千行。

据我所知,我正在关注Replacing rows in bulk的API文档。

我唯一能想到的是,由于一个错误,我有多行具有相同的rowid。

修改

以下是一些重复的行标识符:

enter image description here

rowid肯定被设置为行标识符:

enter image description here

现在假设行标识符应该是“essentially act the same way as primary keys”,我开始怀疑这是一个错误,还是出现了可怕的错误?发布代码如下所示:

def publishDataset(rows):
  r = requests.post(config.dataset, data=simplejson.dumps(rows), headers = headers, auth=config.auth)
  j = r.json()
  print
  if r.status_code != 200:
    raise RuntimeError ( "%d Socrata error: %s" % (r.status_code, j['message']))
  return j

此处的完整代码:https://github.com/stevage/meshlium-soda

1 个答案:

答案 0 :(得分:1)

很抱歉延迟回复你。我认为文档中存在一个错误,您应该在API端点上使用DELETE:

%> curl --verbose -X DELETE --header "X-App-Token: [REDACTED]" --user [REDACTED] https://soda.demo.socrata.com/resource/ppbu-8a96.json
Enter host password for user '[REDACTED]':
* Hostname was NOT found in DNS cache
*   Trying 216.227.229.224...
* Connected to soda.demo.socrata.com (216.227.229.224) port 443 (#0)
* TLS 1.0 connection using TLS_DHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate: *.demo.socrata.com
* Server certificate: AlphaSSL CA - SHA256 - G2
* Server certificate: GlobalSign Root CA
* Server auth using Basic with user '[REDACTED]'
> DELETE /resource/ppbu-8a96.json HTTP/1.1
> Authorization: Basic [REDACTED]
> User-Agent: curl/7.37.1
> Host: soda.demo.socrata.com
> Accept: */*
> X-App-Token: [REDACTED]
>
< HTTP/1.1 200 OK
* Server nginx is not blacklisted
< Server: nginx
< Date: Fri, 09 Jan 2015 06:31:16 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< X-Socrata-Region: production
< Age: 14
<

这应该可以解决问题。如果它也适合你,我会更新我的文档。抱歉混乱!