能否从Python程序调用SQLite3命令行?脚本中如何程序化操作其CLI?
回答你的两个SQLite + Python问题
1. 能不能从Python程序中调用SQLite3命令行?
当然可以!你可以用Python的subprocess模块直接调用系统中的sqlite3命令行工具,就像在终端手动敲命令一样。这种方式适合你想复用SQLite命令行的快捷功能(比如.import批量导入CSV)。
举个快速实现的例子:
import subprocess # 调用sqlite3命令行,执行CSV导入操作 subprocess.run([ 'sqlite3', 'qgis.db', '.mode csv', '.import media.csv video' ], check=True)
注意:要确保你的系统PATH里能找到sqlite3命令,同时数据库文件和CSV文件的路径要准确。
2. 能否在脚本内通过编程方式操作SQLite3命令行界面?
其实非常不推荐直接操作命令行界面——命令行是交互式的,编程时处理输入输出、错误捕获都会很麻烦,容易出现不可控的问题。更优雅的方式是用Python自带的sqlite3库直接完成所有数据库操作,全程不需要碰命令行。
如果真的有特殊需求必须和命令行界面交互(比如执行一些只有命令行支持的点命令),可以用subprocess.Popen配合标准输入输出实现,但这种方式容错性很低,尽量避免。
针对你的CSV导入需求,正确的实现方案
你之前的代码把SQL语句和SQLite命令行的点命令混在一起了,这是行不通的——Python的sqlite3库只识别标准SQL,不认.mode、.import这种命令行专属指令。给你两种靠谱的实现思路:
方案一:用Python的sqlite3库直接导入CSV(推荐)
自己读取CSV文件,批量插入数据库,全程用Python控制,灵活性和可控性更强:
import sqlite3 import csv # 连接数据库 conn = sqlite3.connect('qgis.db') curs = conn.cursor() # 修正SQL语法:DROP TABLE的IF EXISTS要放在表名前面 curs.execute('DROP TABLE IF EXISTS video') curs.execute('CREATE TABLE IF NOT EXISTS video(id, name, duration)') # 读取CSV并批量插入 with open('media.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) # 如果你的CSV有表头,先跳过表头行 next(reader) # 用executemany批量插入,效率更高 curs.executemany('INSERT INTO video VALUES (?, ?, ?)', reader) # 提交更改并关闭连接 conn.commit() conn.close()
方案二:用subprocess调用SQLite命令行(适合简单场景)
如果你还是想用.import的快捷方式,就通过subprocess把命令传递给sqlite3命令行:
import subprocess # 定义要执行的SQLite命令行指令 commands = ''' DROP TABLE IF EXISTS video; CREATE TABLE IF NOT EXISTS video(id, name, duration); .mode csv; .import media.csv video; ''' # 通过标准输入把命令传递给sqlite3 subprocess.run( ['sqlite3', 'qgis.db'], input=commands.encode('utf-8'), check=True )
小提醒
- 用Python的
sqlite3库的好处是:可以在插入前清洗CSV数据、方便捕获错误,而且不依赖系统的sqlite3命令行版本,兼容性更好。 - 如果你的CSV包含特殊字符或换行,方案一的
csv.reader会比命令行导入更安全,避免格式解析错误。
内容的提问来源于stack exchange,提问作者Scott Bing
相关产品推荐
相关产品推荐

