将多文件十六进制字符串导入SQLite3时出错,求代码排查
你的SQLite导入代码问题分析及修复
代码存在的问题及错误原因
- SQL语法错误:你用f-string拼接插入语句时,直接写
VALUES({i}),当i是0D这类字符串时,SQL会将其识别为数字而非字符串,导致语法报错。SQL中字符串类型的值必须用单引号包裹,否则数据库无法正确解析。 - 重复创建数据库连接:每次调用
read_text_file都重新连接数据库、执行建表语句,虽有IF NOT EXISTS,但属于不必要的重复操作,浪费资源。 - 空行处理不当:用
read().split("\n")分割行时,文件末尾的换行会生成空字符串,插入空值可能不符合你的需求。 - 路径拼接不规范:用
f"{path}\{file}"拼接路径,在Windows下虽能运行,但不如os.path.join跨平台且安全,易出现转义字符问题。
修正后的代码
import os import sqlite3 path = r'H:\ttestt' def read_text_file(file_path, cursor): with open(file_path, 'r') as f: # 逐行读取并处理,避免一次性加载大文件 for line in f: line = line.strip() if not line: # 跳过空行 continue print(line) # 使用参数化查询,自动处理字符串格式,避免语法错误 cursor.execute("INSERT INTO checksum VALUES(?)", (line,)) # 仅创建一次数据库连接和游标,提升效率 conn = sqlite3.connect(os.path.join(path, "checksum.db")) c = conn.cursor() c.execute("CREATE TABLE IF NOT EXISTS checksum(first text)") for file in os.listdir(path): if file.endswith(".java"): file_path = os.path.join(path, file) print(file_path) read_text_file(file_path, c) conn.commit() conn.close()
核心修正说明
- 参数化查询:用
?作为占位符传递参数,SQL会自动为字符串添加引号,彻底解决语法错误,同时避免SQL注入风险。 - 统一连接管理:将数据库连接和游标移到函数外,只初始化一次,处理完所有文件后再提交关闭,减少资源消耗。
- 逐行读取+空行过滤:逐行读取文件更高效,
strip()+空行判断确保只插入有效内容。 - 规范路径拼接:用
os.path.join处理路径,适配不同操作系统,避免路径分隔符错误。
内容的提问来源于stack exchange,提问作者ya xi er
相关产品推荐
相关产品推荐

