sql文件不是json格式,需用sqlite3内存数据库或sqlparse解析;sqlite导出文件可用executescript执行后提取数据,mysql/postgresql需先剥离insert语句并处理编码、blob等特殊字段。

SQL文件不是标准数据格式,不能直接用json.load()解析
很多人拿到一个dump.sql就下意识想用json.loads()或pd.read_json(),结果抛出JSONDecodeError: Expecting value。这是因为SQL导出文件本质是文本语句集合(如INSERT INTO users VALUES (1, 'Alice');),不是JSON结构。必须先提取数据,再构造字典/列表,最后序列化。
用sqlite3内存数据库解析SQLite导出的SQL最稳妥
如果原始SQL来自SQLite(常见于sqlite3 .dump命令),可直接加载到内存DB执行,再用cursor.fetchall()取值。比正则解析更可靠,避免字段含引号、换行、转义等导致的错位。
- 确保SQL文件以
CREATE TABLE开头,且不含PRAGMA或BEGIN TRANSACTION等非DML语句(可先用grep -v "^PRAGMA\|^BEGIN\|^COMMIT" dump.sql > clean.sql过滤) - 用
sqlite3.connect(":memory:")创建空内存库,调用conn.executescript()一次性执行全部建表+插入语句 - 对每个表执行
SELECT * FROM table_name,用cursor.description获取字段名,组合成dict列表
import sqlite3
import json
<p>conn = sqlite3.connect(":memory:")
with open("dump.sql") as f:
conn.executescript(f.read())</p><p>tables = [row[0] for row in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")]
result = {}
for table in tables:
cur = conn.execute(f"SELECT * FROM {table}")
columns = [desc[0] for desc in cur.description]
result[table] = [dict(zip(columns, row)) for row in cur.fetchall()]</p><p>with open("output.json", "w") as f:
json.dump(result, f, indent=2)
</p>
MySQL/PostgreSQL导出的SQL需先剥离INSERT语句再解析
这类SQL通常包含大量INSERT INTO table (...) VALUES (...);,且括号内可能嵌套逗号、单引号、NULL等。硬写正则极易断裂。推荐用sqlparse库做语法级拆分:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 安装:
pip install sqlparse - 用
sqlparse.parse()得到语句对象,过滤出INSERT类型节点 - 对每条
INSERT,提取表名、字段列表、值列表;注意处理NULL、字符串引号、十六进制字面量(如X'FF') - 字段名缺失时(如
INSERT INTO t VALUES (1,'a')),需提前用DESCRIBE t或\d t查表结构
若SQL中混有UPDATE或DELETE,它们不产生JSON数据,应跳过。
遇到中文乱码或BLOB字段要单独处理
导出SQL若含INSERT INTO t VALUES (1, X'c3a9');(UTF-8 hex)或INSERT ... VALUES ('中文', 0x8000);,直接当字符串读会出错。关键点:
- 打开文件时显式指定编码:
open("dump.sql", encoding="utf-8")(若报错尝试gbk或latin-1) - 识别
X'...'或0x...模式,用bytes.fromhex()转为bytes,再按需解码(如.decode('utf-8', errors='ignore')) - JSON不支持
bytes,必须转为str或base64编码字符串(base64.b64encode(blob).decode())
真正麻烦的是SQL里混用多种编码、字段类型和转义规则——这种情况下,与其硬解析,不如让原数据库直出JSON(如MySQL 5.7+ 的SELECT ... INTO OUTFILE配合JSON_OBJECT)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










