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

如何将嵌套列表插入SQLite数据库表并解决near "0"语法报错

问题原因
  • 嵌套f-string语法错误:你在f字符串内部又嵌套了一层f"语法,同时引号冲突,直接导致生成的SQL语句格式完全错乱,这是触发near "0": syntax error报错的直接原因。
  • SQL插入语法错误:你建的表名为frames,但报错回溯里的语句还写错了表名tableframe;同时INSERT语句的VALUES参数拼接完全不符合SQL规范,字符串值没有正确处理转义。
  • 直接拼接SQL存在安全和兼容性问题:如果待插入的字符串里包含单引号,会直接触发语法错误,同时存在SQL注入风险,SQLite官方推荐使用参数化查询传递参数,不要手动拼接语句。
  • 路径匹配逻辑不严谨:re.search(ele[0],paths[n])只要路径任意位置包含对应数字就会匹配成功,比如路径dir/123/456.png遇到编码123也会误匹配,不符合你「扩展名前的数字编码匹配」的需求。
  • 缺少事务提交:SQLite默认开启隐式事务,插入操作后需要调用connection.commit()才能将数据真正写入磁盘,否则程序退出后数据会丢失。
修复方案
import sqlite3
import os

# 示例数据可替换为你的实际数据
paths = ["dir/subdir1/123.png", "dir/subdir2/456.png", "dir/subdir3/789.png"]
lol = [["123", "string1", "string2", "string3"], ["456","stringA", "stringB", "stringC"],["789", "stringQ", "stringW", "stringR"]]

connection = sqlite3.connect("Database.db")
cursor = connection.cursor()

# 建表语句保持不变
tableframe = "CREATE TABLE IF NOT EXISTS frames (frame_id INTEGER PRIMARY KEY, valuex TEXT, valuey TEXT, valuez TEXT, valuew TEXT, valueq TEXT) "
cursor.execute(tableframe)

n = 0
for ele in lol:
    # 提取路径中扩展名前的编码,完全避免误匹配
    filename = os.path.basename(paths[n])
    path_code = filename.split('.')[0]
    if path_code == ele[0]:
        print(f"{n},'{paths[n]}','{ele[0]}','{ele[1]}','{ele[2]}','{ele[3]}'")
        # 使用参数化查询,不需要手动拼接字符串,自动处理转义
        cursor.execute(
            "INSERT INTO frames VALUES (?, ?, ?, ?, ?, ?)",
            (n, paths[n], ele[0], ele[1], ele[2], ele[3])
        )
        n += 1
        print('DONE')

# 提交事务保存数据,关闭连接
connection.commit()
connection.close()

内容的提问来源于stack exchange,提问作者Salvatore Pennisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:27:03