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,符合需求。
二、修复更新语句不生效问题
你的更新语句存在两个核心问题:
- 仍用单引号包裹年份列名,导致SQL无法识别目标列;
- 直接用
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
相关产品推荐
相关产品推荐

