我正在尝试使用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。
修改
以下是一些重复的行标识符:
rowid
肯定被设置为行标识符:
现在假设行标识符应该是“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
答案 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
<
这应该可以解决问题。如果它也适合你,我会更新我的文档。抱歉混乱!