Python SQLite执行多语句代码报错,请求排查问题原因
SQLite代码错误分析及修复
存在的问题
- 单execute无法执行多语句+参数绑定冲突:sqlite3的
cursor.execute()单次只能执行单条SQL语句,你把BEGIN、两个INSERT、END放在同一个execute里,不仅无法正常执行,还会因为跨语句导致占位符与参数的匹配逻辑混乱。 - LAST_INSERT_ROWID()用法错误:该函数不需要添加
from Students,直接调用LAST_INSERT_ROWID()就能获取当前连接最后插入的行ID;加了from子句后,会根据Students表的行数返回重复的ID结果,不符合需求。 - 事务重复处理:你在SQL里手动写了
BEGIN TRANSACTION和END TRANSACTION,又调用了conn.commit(),这会造成事务逻辑冲突。sqlite3中,要么用SQL语句管理事务,要么用Python API(conn.begin()/conn.commit()),二者选其一即可。
修复后的代码
import sqlite3 conn = sqlite3.connect("Sqlite3 file path") cursor = conn.cursor() Name = "Test" LastName = "Test" Id = 2 Grade = 12 try: # 通过Python API开启事务 conn.begin() # 拆分执行两条INSERT语句 cursor.execute("INSERT INTO Students (FirstName,LastName) VALUES(?,?);", (Name, LastName)) # 直接通过cursor属性获取最后插入的学生ID student_id = cursor.lastrowid cursor.execute("INSERT INTO StudentsYears (StudentId,YearId,Grade) VALUES(?,?,?);", (student_id, Id, Grade)) conn.commit() except Exception as e: # 出错时回滚事务 conn.rollback() print(f"错误信息: {e}") finally: # 关闭游标与连接 cursor.close() conn.close()
额外说明
- 使用
cursor.lastrowid比在SQL中调用LAST_INSERT_ROWID()更贴合Python sqlite3的API设计,代码可读性更强。 - 加入异常捕获与回滚逻辑,能避免事务中途出错导致的数据不一致问题。
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

