You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7 SQLite3插入JSON数据遇KeyError问题求助

解决JSON缺失字段导致SQLite插入KeyError的问题

问题背景

Python2.7脚本将JSON数据插入SQLite3数据库时,若JSON对象缺少oraInizio或oraFine字段,会触发KeyError中断插入流程。

原脚本代码

connection = sqlite3.connect(PATH_DB)
cursor = connection.cursor()
table='''CREATE TABLE IF NOT EXISTS trieste(
   id          INTEGER  PRIMARY KEY
  ,farmaciaId  INTEGER  
  ,codOpenData INTEGER  
  ,ragSoc      VARCHAR(40) 
  ,distanza    NUMBER(10,0) 
  ,indirizzo   VARCHAR(48) 
  ,latitudine  NUMERIC(9,6) 
  ,longitudine NUMERIC(9,6) 
  ,telefono    VARCHAR(11) 
  ,paese       VARCHAR(6) 
  ,provincia   VARCHAR(2) 
  ,localita    VARCHAR(22) 
  ,cap         INTEGER  
  ,stato       VARCHAR(1) 
  ,data        DATE  
  ,oraInizio   VARCHAR(8) 
  ,oraFine     VARCHAR(8)
);'''
cursor.execute(table)

traffic = json.load(open('/var/www/html/src/trieste.json'))
columns = ['farmaciaId','codOpenData','ragSoc','distanza','indirizzo','latitudine','longitudine','telefono','paese','provincia','localita','cap','stato','data','oraInizio','oraFine']
for row in traffic:
    keys= tuple(row[c] for c in columns)
    cursor.execute('INSERT OR REPLACE INTO trieste(farmaciaId,codOpenData,ragSoc,distanza,indirizzo,latitudine,longitudine,telefono,paese,provincia,localita,cap,stato,data,oraInizio,oraFine) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',keys)

错误信息

Traceback (most recent call last):
  File "riempidatabase.py", line 32, in <module>
    keys= tuple(row[c] for c in columns)
  File "riempidatabase.py", line 32, in <genexpr>
    keys= tuple(row[c] for c in columns)
KeyError: 'oraInizio'

缺失字段的JSON示例

{
      "farmaciaId": 558,
      "codOpenData": 5496,
      "ragSoc": "AL CENTAURO",
      "distanza": 0,
      "indirizzo": "Via Domenico Rossetti, 33",
      "latitudine": 45.649959,
      "longitudine": 13.78522,
      "telefono": "040 633080",
      "paese": "Italia",
      "provincia": "1",
      "localita": "Trieste",
      "cap": 34139,
      "stato": "C",
      "data": "2023-03-11"
}

解决方案

问题根源是直接通过row[c]访问字典键,当键不存在时抛出KeyError。改用字典的get()方法,在键不存在时返回指定默认值(比如None),即可避免报错,同时SQLite会将None存储为NULL,符合表字段的非约束要求。

修改生成keys的代码行:

keys = tuple(row.get(c, None) for c in columns)

修改后的完整循环代码

for row in traffic:
    keys = tuple(row.get(c, None) for c in columns)
    cursor.execute('INSERT OR REPLACE INTO trieste(farmaciaId,codOpenData,ragSoc,distanza,indirizzo,latitudine,longitudine,telefono,paese,provincia,localita,cap,stato,data,oraInizio,oraFine) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', keys)

说明

  • dict.get(key, default)方法会优先返回对应键的值,若键不存在则返回default参数指定的值,这里用None对应SQLite的NULL。
  • 由于表结构中oraInizio和oraFine字段未设置NOT NULL约束,存储NULL是合法的。

内容的提问来源于stack exchange,提问作者NicolaIta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:45:08