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

将多文件十六进制字符串导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:25:29