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

Flask操作SQLite时如何获取新插入行的自增rowid?

错误原因分析

  1. 你当前使用SELECT last_insert_rowid() FROM birds的写法错误:last_insert_rowid()是SQLite连接级别的函数,返回当前数据库连接最后一次插入生成的自增ID,不需要指定查询表。加了FROM birds后会为表内的每一行都返回一次计算结果,你当前birds表有7条记录,所以返回了7个字典,且你执行INSERT后再查询时该函数值未正确关联到本次插入操作,所以返回值都是0。
  2. cursor.lastrowid报错是因为你使用的是封装后的db操作对象,没有暴露底层cursor实例,db.lastrowid则是因为该封装类没有实现对应的属性。
  3. RETURNING语法报错大概率是因为你传入SQL参数时没有将单个参数包裹为元组,字符串参数被按字符拆分传入,导致SQL结构异常。

可行解决方案

方案1:修复last_insert_rowid()查询逻辑

直接查询last_insert_rowid(),不需要加FROM子句,取返回结果的第一条记录的对应值即可,修改后代码如下:

@app.route("/", methods = ["GET", "POST"])
def index():
    if request.method == "GET":
        treeList = db.execute("SELECT * FROM trees")
        birdList = db.execute("SELECT * FROM birds")
        return render_template ("SQLtest.html", treeList = treeList, birdList = birdList)
    else:
        newBird = request.form.get("newBird")
        db.execute("INSERT INTO birds (name) VALUES (?)", newBird)
        # 去掉FROM子句,给返回字段起别名方便取值,取第一条结果的id
        newBirdID = db.execute("SELECT last_insert_rowid() AS id")[0]["id"]
        print(f"You really saw a {newBird}? Its ID is now {newBirdID}")
        return redirect("/")

方案2:修复RETURNING语法调用逻辑

将参数包裹为单元素元组(注意元组单个元素末尾要加逗号),执行后取返回结果的id值:

newBird = request.form.get("newBird")
# 参数用(newBird,)包裹为元组,避免字符串被拆分
insert_result = db.execute("INSERT INTO birds (name) VALUES (?) RETURNING id", (newBird,))
newBirdID = insert_result[0]["id"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:27:01