Flask操作SQLite时如何获取新插入行的自增rowid?
错误原因分析
- 你当前使用
SELECT last_insert_rowid() FROM birds的写法错误:last_insert_rowid()是SQLite连接级别的函数,返回当前数据库连接最后一次插入生成的自增ID,不需要指定查询表。加了FROM birds后会为表内的每一行都返回一次计算结果,你当前birds表有7条记录,所以返回了7个字典,且你执行INSERT后再查询时该函数值未正确关联到本次插入操作,所以返回值都是0。 cursor.lastrowid报错是因为你使用的是封装后的db操作对象,没有暴露底层cursor实例,db.lastrowid则是因为该封装类没有实现对应的属性。- 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
相关产品推荐
相关产品推荐

