无法使用带有两个按钮的烧瓶从 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 中删除记录的主要内容,如果未能解决你的问题,请参考以下文章