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

连接SQLite并导入JSON数据时如何解决缩进错误?

解决SQLite插入JSON数据时的缩进错误问题

你遇到的这个IndentationError在Python里真的是高频坑——说白了就是代码里的缩进风格不统一,要么混着用了空格和制表符(Tab),要么缩进的数量乱了,导致Python没法识别正确的代码层级。

先看你给出的报错信息:

File "roster.py", line 51
cur.execute('''INSERT OR IGNORE INTO Member(user_id,course_id,role)
^IndentationError: unindent does not match any outer indentation level

这行代码属于for entry in json_data:循环的内部代码,但它的缩进和循环里其他代码的缩进不匹配。Python对缩进的要求特别严格,同一层级的代码必须用完全一致的缩进规则(要么全用4个空格,要么全用Tab,绝对不能混着来)。

具体修复步骤

  1. 统一缩进风格:把代码里所有的Tab替换成4个空格(这是Python官方推荐的缩进方式)。你可以用编辑器的“批量替换”功能,一次性把所有Tab转换成空格。
  2. 对齐循环内的代码:for循环下面的每一行代码(从name=entry[0]到最后的cur.execute(...))都要保持相同的缩进级别,确保它们都属于这个循环的内部逻辑。
  3. 顺便修复一个小bug:你的代码里fname=roster_data.json这一行少了引号,应该写成fname='roster_data.json',否则Python会把roster_data当成变量,触发NameError。

修复后的完整代码

import sqlite3
import json

conn = sqlite3.connect('rosterdb.sqlite')
cur = conn.cursor()
cur.execute( 
''' 
DROP TABLE IF EXISTS USER; 
DROP TABLE IF EXISTS Course; 
DROP TABLE IF EXISTS Member; 
CREATE TABLE User ( 
 id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
 name TEXT UNIQUE 
); 
CREATE TABLE Course ( 
 id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
 title TEXT UNIQUE 
); 
CREATE TABLE Member ( 
 user_id INTEGER, 
 course_id INTEGER, 
 role INTEGER, 
 PRIMARY KEY (user_id, course_id) 
) 
''' 
)
fname = input('Enter file name: ')
if len(fname) < 1: 
    fname = 'roster_data.json'  # 补全字符串引号
str_data = open(fname).read()
json_data = json.loads(str_data)
for entry in json_data:
    name = entry[0]
    title = entry[1]
    role = entry[2]
    print(name, title, role)
    cur.execute('''INSERT OR IGNORE INTO User (name) VALUES ( ? )''', ( name, ) )
    cur.execute('SELECT id FROM User WHERE name = ? ', (name, ))
    user_id = cur.fetchone()[0]
    cur.execute('''INSERT OR IGNORE INTO Course (title) VALUES ( ? )''', ( title, ) )
    cur.execute('SELECT id FROM Course WHERE title = ? ', (title, ))
    course_id = cur.fetchone()[0]
    cur.execute('''INSERT OR IGNORE INTO Member(user_id,course_id,role) VALUES(?,?,?)''',(user_id,course_id,role))
conn.commit()

另外建议你在编辑器里开启“显示空白字符”的功能,这样就能直观看到哪些地方用了Tab、哪些用了空格,后续排查缩进问题会方便很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:52:06