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

Python SQLite动态表:插入非指定字段设Null及更新失败问题

问题解决方法

一、修复插入后年份列值异常(默认设为Null)

你创建表时用单引号包裹年份列名是错误的——单引号在SQL中用于包裹字符串值,而非列名这类标识符。年份以数字开头,属于SQLite的特殊标识符,需要用**反引号(`)或双引号(")**包裹,否则会导致列名定义异常,进而出现插入后列值不符合预期的情况。

修改表创建代码如下:

year_list = range(start_year, end_year+1)

dbs_to_create = ["Revenue", "Sale", "Rev_Maintenance",...]

for db_name in dbs_to_create:
    concat_string = ""
    for year_used in year_list:
        # 用反引号包裹年份列名,修正标识符定义
        concat_string += ", `{}` REAL".format(str(year_used))
    
    cursor.execute("CREATE TABLE IF NOT EXISTS {} ( Project_name TEXT PRIMARY KEY{});".format(db_name, concat_string))

修改后,未指定值的年份列会自动填充NULL,符合需求。

二、修复更新语句不生效问题

你的更新语句存在两个核心问题:

  1. 仍用单引号包裹年份列名,导致SQL无法识别目标列;
  2. 直接用format拼接SQL,易因数据类型(如字符串未加引号)引发语法错误,还存在SQL注入风险。

修改为参数化查询(SQLite推荐的安全写法):

cursor.execute("SELECT * FROM Revenue WHERE Project_name = ?", (project_number,))
if cursor.fetchone() is None:
    cursor.execute("INSERT INTO Revenue (Project_name) VALUES (?);", (project_number,))
    conn.commit()
else:
    # 用反引号包裹年份列名,通过参数化传递变量避免语法错误
    update_sql = "UPDATE Revenue SET `{}` = ? WHERE Project_name = ?".format(curr_year)
    cursor.execute(update_sql, (revenue_cell_val, project_number)) 
    conn.commit()

关键说明:

  • 反引号确保年份列名被正确识别;
  • 参数化查询会自动处理不同数据类型的格式问题(如字符串自动加引号),同时避免SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 12:59:14