2017-05-07 10 views
1

연습에서 필자는 API에서 데이터를 가져 와서 psql 데이터베이스에 삽입합니다. 초기 당당 1000 항목의 기본 제한을 따르고 있었지만 약 40K 행인 모든 데이터를 가져 오려고했습니다. 실험 조금 후에, 나는 4800을 뽑을 수 있지만, 나는 다음과 같은 얻을 : 내가 검토 한Python KeyError : peewee를 사용하는 insert_many()

import peewee 


psql_db = peewee.PostgresqlDatabase('database', user='my_username') 

class Bike_Count(peewee.Model): 
    date = peewee.DateTimeField() 
    fremont_bridge_sb = peewee.IntegerField() 
    fremont_bridge_nb = peewee.IntegerField() 

    class Meta: 
     database = psql_db 

Traceback (most recent call last): 
    File "data_pull.py", line 19, in <module> 
    postgres_db.Bike_Count.insert_many(data).execute() 
    File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 3516, in execute 
    cursor = self._execute() 
    File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2901, in _execute 
    sql, params = self.sql() 
    File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 3484, in sql 
    return self.compiler().generate_insert(self) 
    File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2084, in generate_insert 
    value = row_dict[field] 
KeyError: <peewee.IntegerField object at 0x7f5b32c2c7f0> 

data_pull.py

import json, requests, peewee 
import postgres_db 


endpoint = 'https://data.seattle.gov/resource/4xy5-26gy.json?$limit=4800' 

response = requests.get(endpoint, headers={'X-App-Token': '(REMOVED)'}) 
if response.status_code == 200: 
    data = json.loads(response.text) 


postgres_db.Bike_Count.create_table(True) 
postgres_db.Bike_Count.insert_many(data).execute() 

postgres_db.py 거기에 항목이있는 문제가 있다고 생각하는 온라인 테이블이 있지만 나는 아무것도 발견 할 수 없습니다. 도와 주셔서 감사합니다. 나는 (토큰과 4800 제한 응용 프로그램을 제거) 로컬 코드를 시도하고 예상대로 일

+0

필요에 따라 서식을 지정하지 않고 응답 데이터 문자열을 테이블에 직접 삽입하는 방법은 무엇입니까? 응답이 datetime 값과 두 개의 정수가있는 목록을 반환하도록 보장됩니까? – wave5459

+0

필요에 따라 서식을 지정한다는 것은 무엇을 의미합니까? 제 생각에 json.loads()는 객체를 반환하고 있습니다.이 경우 객체는 사전 목록입니다. API 문서에 따르면 필드는 날짜/시간 필드와 두 개의 숫자 필드입니다. ~ 4800 행까지의 테이블을 얻을 수있는 이상한 일이며 오류가 발생합니다. –

+0

다음은 데이터 세트의 정보에 대한 링크입니다. https : //data.seattle.gov/Transportation/Fremont-Bridge-Hourly-Bicycle-Counts-by-Month-Octo/65db-xm6k –

답변

1

: 나는 부착 된 LIMIT와 함께 실행했을 때 내가 눈치 무엇

id |  date   | fremont_bridge_sb | fremont_bridge_nb 
------+---------------------+-------------------+------------------- 
    1 | 2017-01-09 06:00:00 |    28 |    55 
    2 | 2017-01-04 20:00:00 |    19 |    10 
    3 | 2017-01-18 13:00:00 |    18 |    18 
    4 | 2017-01-06 11:00:00 |    22 |    15 
    5 | 2017-01-27 11:00:00 |    39 |    38 
    6 | 2017-01-08 14:00:00 |     6 |    10 
    7 | 2017-01-06 23:00:00 |     8 |     3 
    8 | 2017-01-27 13:00:00 |    45 |    35 
... 

은 행 중 하나가 반환한다는 것입니다 API에 의해 date 키 (fremont_bridge_nb 및 fremont_bridge_sb 필드가 누락) 만 포함됩니다.

Peewee는 각 행에 동일한 키가있는 대량 삽입을 요구하므로 peewee가 모든 3 개의 키를 찾을 것으로 예상됩니다.

+0

그런 식의 데이터. 나는 어제 그것을 또한 알아 차렸다. 실제로 값이 누락 된 행이 두 개 이상 있습니다. 나는''null = True'''를 설정하여 NULL이라도 괜찮다고 말하려고했지만, 문제 해결 후에 마침내 기본값을 1로 설정했습니다. –