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

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)

可选优化建议

  1. 不要通过查询最大ID+1的方式生成自增主键,直接将表的ID字段设置为INTEGER PRIMARY KEY AUTOINCREMENT,插入时不需要传入ID字段,由数据库自动生成,可避免并发写入场景下的ID冲突问题
  2. 更新逻辑中的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)
  1. add_column函数中新增列时也对列名添加反引号包裹,避免后续新增非标准列名时触发同类语法错误。

内容的提问来源于stack exchange,提问作者C. Nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:04