如何将嵌套列表插入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
相关产品推荐
相关产品推荐

