2017-05-07 25 views
1

作为练习,我从API中提取数据并将其插入到psql数据库中。我最初遵循每拉1000个条目的默认限制,但决定我想尝试并获得大约40K行的所有数据。有点实验后,我可以拉4800,但后来我得到如下:Python KeyError:<peewee.IntegerField object at ...>使用peewee insert_many()

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

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 

我已经看了在线表格认为那里有一个入口问题,但我找不到任何明显的问题。谢谢您的帮助。

+0

如何将响应数据字符串直接插入到表格中而无需根据需要进行格式化?响应是否保证返回一个带有日期时间值和两个整数的列表? – wave5459

+0

你的意思是格式化它的必要性?我的理解是,json.loads()返回一个对象,在这种情况下,它是一个字典列表。 API文档说这些字段是日期/时间字段和两个数字字段。奇怪的是,我能得到一张高达4800行的表格,然后出现错误。 –

+0

以下是关于数据集信息的链接:https://data.seattle.gov/Transportation/Fremont-Bridge-Hourly-Bicycle-Counts-by-Month-Octo/65db-xm6k –

回答

1

我想你的代码在本地(删除应用令牌和4800极限)和它的工作如预期:

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 
... 

什么时候我附加了LIMIT跑了我注意到的是,该行的一个返回由API只包含date键(缺少fremont_bridge_nb和fremont_bridge_sb字段)。

Peewee需要批量插入每行都有相同的密钥,所以问题是peewee期望找到所有3个密钥。

+0

感谢一吨通过这样的数据。我昨天也注意到了;实际上,至少有两行缺少值。我试图设置'''null = True'''来表示可以,如果它们为空,但经过一些故障排除后,我终于决定将其默认设置为1。 –