0

SODA API を使用して、Socrata データセット内のすべての行をプログラムで削除しようとしています。データセット自体を削除したくありません。再構築するために多くの作業が必要になるからです。また、数千行に対してこれを行うのは非常に遅いです。

以前は、 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 などの問題でもありません。)

前後の行数も問い合わせてみましたが変化なし。まだ数千行。

私が知る限り、行を一括で置換するための API ドキュメントに従っています。

私が考えることができる唯一のことは、バグのために、同じ行 ID を持つ複数の行があるということです。

編集

いくつかの重複する行識別子を次に示します。

ここに画像の説明を入力

rowid行識別子として確実に設定されます。

ここに画像の説明を入力

行識別子は「本質的に主キーと同じように動作する」と想定されているため、これはバグなのか、それとも何かがひどく間違っているのか疑問に思い始めています。パブリッシング コードは次のようになります。

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

4

1 に答える 1

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
<

これでうまくいくはずです。あなたにも当てはまる場合は、ドキュメントを更新します。混乱させて申し訳ありません!

于 2015-01-09T06:33:25.773 に答える