无法使用带有两个按钮的烧瓶从 sqlite db 中删除记录

Posted

技术标签:

【中文标题】无法使用带有两个按钮的烧瓶从 sqlite db 中删除记录【英文标题】:Unable to delete records from sqlite db using flask with two buttons 【发布时间】:2021-11-13 16:08:01 【问题描述】:

在我的 flask+sqlite 应用程序中,我创建了两个按钮,分别用于更新和删除数据。它可以正常插入,但是在删除记录时,记录是 不删除。这是我第一个使用 CRUD 实现的学习项目。

app.py

from flask import Flask, render_template, g, request, redirect, url_for
import sqlite3

app = Flask(__name__)

def connect_db():
    connection = sqlite3.connect('./books.db')
    connection.row_factory = sqlite3.Row
    return connection

def get_db():
    if not hasattr(g, 'sqlite3'):
        g.sqlite3_db = connect_db()
    return g.sqlite3_db

@app.route("/")
def main():
    return render_template('book.html')   

@app.route('/', methods=['POST'])
def delete(book):
    if request.method == "POST":
        if request.form['submit'] == 'delete':
            db = get_db()
            cursor = db.execute("delete from books where book = ?", book)
            db.commit()
    return redirect(url_for('view'))
   
@app.route('/view', methods=["GET"])
def view():
    db = get_db()
    cursor = db.execute('select * from books')
    rows = cursor.fetchall()
    return render_template('view.html', rows=rows)


if __name__ == '__main__':
    app.run(debug=True)

View.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BookStore</title>
</head>
<body>
 <h1> Use this page for adding,deleting book from records </h1>
<form action="" method="POST" >
   <label for="book">Book</label>
          <input type="text" id="book" name="book"><br><br>
   <label for="author">Author</label>
          <input type="text" id="author" name="author"><br><br>
   <label for="category">Book Category</label>
         <select name="category" id="category">
             <option value></option>
             <option value="Fiction">Fiction</option>
             <option value="Non-Fiction">Non-Fiction</option>
             <option value="Business">Business and Management</option>
             <option value="Biography">Biography</option>
         </select><br><br>
    <button type="submit" name="submit" value="update">update</button>
   <button type="submit" name="submit" value="delete">delete</button>
</form>
</body>
</html>

【问题讨论】:

SQLite 中book 的情况可能与输入不同?此外,DB-API 指定.execute() 的第二个参数应该是一个容器。因此,请尝试:db.execute("delete from books where book = ?", (book,)),其中括号/括号和逗号组成一个元组。 @mechanical_meat,感谢您的回复,但是用逗号和括号创建容器,即 (book,)) 仍然不起作用。另外,你能帮我理解第一行“书是不同的离子sqlite然后输入。在我的数据库中,我有三列:书,作者,类别。 【参考方案1】:

对于同一端点 /,您有 2 个函数(main 和 delete)。还有delete(book)函数中的book变量,它的值从来没有被传递过。

 @app.route('/<book>', methods=['POST'])
def delete(book):
    if request.method == "POST":
        if request.form['submit'] == 'delete':
            db = get_db()
            cursor = db.execute("delete from books where book = ?", book)
            db.commit()
    return redirect(url_for('view'))

试试这样的方法,您可以在 URL 中传递书名。

【讨论】:

以上是关于无法使用带有两个按钮的烧瓶从 sqlite db 中删除记录的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶躁动无法构造查询

尝试仅使用 html 按钮将数据传递给烧瓶应用程序

如何将数据从 listview 单选按钮保存到 SQLite?

无法从 iOS 应用程序打开 sqlite DB

带有多个参数的烧瓶 url_for()

带有预加载 sqlite3 数据库的 iOS 单元测试