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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:10:31