我的 Flask 应用程序如何检查 SQLite3 事务是否正在进行?

How can my Flask app check whether a SQLite3 transaction is in progress?

我正在尝试使用 @app.errorhandler (500) 功能构建一些智能错误消息。例如,我的路由包含一个到数据库的 INSERT 命令:

if request.method == "POST":
   userID = int(request.form.get("userID"))
   topicID = int(request.form.get("topicID"))
   db.execute("BEGIN TRANSACTION")
   db.execute("INSERT INTO UserToTopic (userID,topicID) VALUES (?,?)", userID, topicID)
   db.execute("COMMIT")

如果该事务违反约束,例如 UNIQUE 或 FOREIGN_KEY,我想捕获错误并显示一条用户友好的消息。为此,我使用 Flask @app.errorhandler 如下:

@app.errorhandler(500)
def internal_error(error):
    db.execute("ROLLBACK")
    return render_template('500.html'), 500

如果我正在处理数据库事务,“ROLLBACK”命令可以正常工作。但有时 500 错误与数据库无关,在这些情况下,ROLLBACK 语句本身会导致错误,因为您无法回滚从未启动的事务。因此,我正在寻找一种方法,该方法 returns 一个布尔值,如果正在进行数据库事务则该值为 true,否则为 false,因此我可以使用它来使 ROLLBACK 成为条件。我在 SQLite3 documentation is for a C interface 中可以找到的唯一一个,但我无法让它与我的 Python 代码一起使用。有什么建议吗?

我知道如果我对我的表单和路线足够小心,我可以防止 99% 的潜在违反数据库规则的行为。但我仍然想要一个智能错误捕捉器来保护我的其他 1%。

我不知道事务在 sqlite 中是如何工作的,但是你想做什么,你可以通过 try/except 语句

来实现
  1. 在函数
  2. 中使用try/except
try:
    db.execute("ROLLBACK")
except:
    pass
return render_template('500.html'), 500
  1. 插入数据时使用try/except。
from flask import abort
try:
    userID = int(request.form.get("userID"))
    [...]
except:
    db.rollback()
    abort(500)

我对sqlite错误不熟悉,如果你知道除了那个特定错误之外发生了什么特定错误。