如何通过批处理文件将JSON数据插入SQLite数据库并解决语句不执行问题
批处理自动插入JSON数据到SQLite的解决方案
问题根因
你在批处理中直接执行sqlite3 数据库路径命令时,会启动SQLite的交互式命令行程序,批处理会进入阻塞状态等待人工输入指令,后续写在批处理中的INSERT语句属于批处理的后续命令行,不会被自动传入SQLite进程,所以完全不会执行。
解决方案(全自动无人工操作)
方案1:直接将SQL语句作为参数传入SQLite命令(最简便,适合短SQL)
直接把完整SQL语句用双引号包裹,跟在数据库路径后面即可,不需要启动交互式模式,执行完成后会自动退出,全程无人工操作。
修改后的完整批处理代码如下:
:: 过滤处理JSON文件 jq -r ".[]" D:\path\2\json_file\somedata.json > D:\path\2\json_file\somedata_new.json :: 带SQL参数执行插入,执行完成自动退出 sqlite3 "C:\path\2\DB_Folder\db1.sqlite" "INSERT INTO mytable (col1, col2, col3, col4) SELECT json_extract(value, '$.col1'), json_extract(value, '$.col2'), json_extract(value, '$.col3'), json_extract(value, '$.col4') FROM json_each(readfile('D:\path\2\json_file\somedata_new.json'));"
方案2:从SQL文件导入(适合多语句、长SQL场景)
如果SQL逻辑复杂语句多,可以把所有SQL语句存为单独的import.sql文件,再通过重定向把文件内容传入SQLite执行,你之前用单独文件没生效大概率是调用方式不对,正确调用方式如下:
- 新建
import.sql文件,写入SQL语句:
INSERT INTO mytable (col1, col2, col3, col4) SELECT json_extract(value, '$.col1'), json_extract(value, '$.col2'), json_extract(value, '$.col3'), json_extract(value, '$.col4') FROM json_each(readfile('D:\path\2\json_file\somedata_new.json')); -- 可添加更多语句,比如查询插入结果验证 SELECT COUNT(*) AS 插入条数 FROM mytable;
- 批处理文件修改为:
jq -r ".[]" D:\path\2\json_file\somedata.json > D:\path\2\json_file\somedata_new.json sqlite3 "C:\path\2\DB_Folder\db1.sqlite" < "C:\path\to\import.sql"
注意事项
- 如果执行时提示找不到
sqlite3命令,把sqlite3替换为sqlite3.exe的完整绝对路径即可,比如"C:\tools\sqlite3.exe" - 所有路径如果包含空格,必须用双引号包裹
- 插入大量数据时可以在SQL语句首尾添加
BEGIN TRANSACTION;和COMMIT;用事务包裹,插入性能提升非常明显
内容的提问来源于stack exchange,提问作者new0ne
相关产品推荐
相关产品推荐

