2015-01-08 2 views
0

SODA API를 사용하여 Socrata 데이터 집합의 모든 행을 프로그래밍 방식으로 삭제하려고합니다. 데이터 세트 자체를 삭제하고 싶지는 않습니다. 왜냐하면 그 데이터 세트를 재구성하기 위해 많은 작업을해야하기 때문입니다. 수천 개의 행에 대해이 작업을 수행하는 것은 매우 느립니다.SODA API가있는 데이터 집합의 모든 행 삭제

이전에는 각 행을 천천히 반복하여 someone on Twitter까지 각각을 삭제하고 행이없는 업서 트를 제안했습니다. 나는 이것을 구현하고 그것이 효과가 있다고 믿지만 지금은 그렇지 않다.

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이나 다른 데이터에도 문제가되지 않습니다.)

또한 앞뒤 행 수를 쿼리하고 t 여기에 변화가 없습니다. 여전히 수천 개의 행이 있습니다.

내가 알 수있는 한, Replacing rows in bulk에 대한 API 문서를 따르고 있습니다.

내가 생각할 수있는 유일한 점은 버그로 인해 같은 rowid를 가진 여러 행이 있다는 것입니다.

rowid

enter image description here 확실히 행 식별자로 설정됩니다 :

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

죄송합니다. 설명서에 버그가있는 것 같아서 대신 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 
< 

트릭을 수행해야합니다. 작동하는 경우 내 문서를 업데이트합니다. 혼란을 드려 죄송합니다!

+0

어, 작동하지 않습니다. 하지만 그 의미는 혼란 스럽습니다. 1. [PUT documentation] (http://dev.socrata.com/publishers/replace.html)은 완전히 잘못되었으므로 실제로 데이터 세트 내용을 대체 할 방법이 없습니까? 2. 행 ID없이 DELETE를 사용하면 문서화되지 않습니다. 3. 자원 자체 대신 자원의 * 내용을 삭제하기 위해 DELETE를 사용하면 표준이 아닐 수도 있습니다. 4. 도대체 왜 전에도 작동 했습니까? :) –

관련 문제