SQLite手动复制行时出现Unrecognized token错误问题问询
问题根因
- 更新(UPDATE)逻辑中你已对所有列名做了反引号包裹处理,符合SQLite对非标准标识符(数字开头、含空格/特殊字符)的语法要求,因此同名字段在更新场景下可以正常执行
- 插入(INSERT)逻辑中拼接列名时未添加反引号包裹,数字开头的列名
1_aux_loss无法被SQLite识别为合法列名,直接触发Unrecognized token报错,该问题和参数列表长度无直接关联,仅因本次插入操作的参数包含该非标准列名触发报错。
修复方案
核心修复
修改插入逻辑的列名拼接代码,统一给所有列名添加反引号包裹,和更新逻辑保持一致:
# --- Primary Key Does Not Exist: make a new row --- if primary_key == None: columns.append('ID') values.append(latest_ID + 1) # 新增:所有列名统一用反引号包裹 quoted_columns = [f"`{col}`" for col in columns] exec_text = 'INSERT INTO projtable (' + ','.join(quoted_columns) +') values(' + ','.join(['?'] * len(values)) + ')' conn.execute(exec_text, values)
可选优化建议
- 不要通过查询最大ID+1的方式生成自增主键,直接将表的ID字段设置为
INTEGER PRIMARY KEY AUTOINCREMENT,插入时不需要传入ID字段,由数据库自动生成,可避免并发写入场景下的ID冲突问题 - 更新逻辑中的WHERE条件也改为参数化实现,避免SQL注入风险:
else: exec_text = 'UPDATE projtable SET ' for col, val in zip(columns, values): exec_text += f"`{col}` = ?, " exec_text = exec_text[:-2] # 改为参数占位符 exec_text += ' WHERE ID = ?' # 主键值加入参数列表统一传入 values.append(int(primary_key)) conn.execute(exec_text, values)
add_column函数中新增列时也对列名添加反引号包裹,避免后续新增非标准列名时触发同类语法错误。
内容的提问来源于stack exchange,提问作者C. Nielsen
相关产品推荐
相关产品推荐

