SQLite3插入语句在Python中无法生效但控制台可正常执行的问题排查及解决建议
修复Python中SQLite3插入语句不生效的问题
我来帮你搞定这个头疼的问题——控制台能正常执行但Python代码里插入没效果还不报错,这种情况我碰到过好几次,核心原因和修复方法如下:
1. 最关键的问题:事务未提交
SQLite在Python的sqlite3模块里默认是开启事务模式的,你执行完cur.execute(stmt)之后,如果没有手动提交事务,数据库会自动回滚这次操作,导致数据根本没写入磁盘。而控制台里的SQLite是默认自动提交的,所以你在控制台跑语句能生效。
修复方法:
在执行完插入语句后,一定要调用连接对象的commit()方法。你可以修改你的store_data函数,或者在调用这个函数之后执行提交:
# 假设你已经创建了连接对象conn def store_data(table_name: str, rec: dict, conn): keys = ','.join(rec.keys()) values = tuple(rec.values()) stmt = f"INSERT INTO {table_name} ({keys}) VALUES {values}" cur = conn.cursor() cur.execute(stmt) conn.commit() # 必须添加这行!提交事务
2. 推荐改用参数化查询(更安全+避免隐形问题)
你当前用字符串拼接生成SQL语句的方式,不仅存在SQL注入风险,还可能因为值里的特殊字符(比如单引号)导致隐形错误(虽然这次没报错,但后续可能出问题)。换成参数化写法更稳妥:
def store_data(table_name: str, rec: dict, conn): keys = ','.join(rec.keys()) # 生成对应数量的占位符? placeholders = ','.join(['?' for _ in rec.values()]) stmt = f"INSERT INTO {table_name} ({keys}) VALUES ({placeholders})" cur = conn.cursor() # 把值作为第二个参数传给execute,由sqlite3自动处理格式 cur.execute(stmt, tuple(rec.values())) conn.commit()
3. 额外检查:字段名匹配
确认你的rec字典里的键和表字段完全一致——你的表结构里是facility_id和facility_name,只要字典里的键没有拼写错误(比如写成facilityId),这部分就没问题。
测试验证
调用函数的时候记得传入数据库连接对象:
# 示例调用 conn = sqlite3.connect('your_database.db') data = {'facility_id': '239SIE39', 'facility_name': 'Lobby A'} store_data('facilities', data, conn) conn.close()
这样修改后,数据应该就能正常插入到数据库里了。
内容的提问来源于stack exchange,提问作者DatCra
相关产品推荐
相关产品推荐

