Sqlite3 删除查询显示成功但不删除行或影响数据库

问题描述

美好的一天,尝试通过构建一个存储联系信息的小型网络应用来提高我的网络技能。允许用户删除应用程序联系人的删除功能显示成功消息,但索引页面显示数据库中的更改。

检查外部 DBReader(DB 浏览器)显示没有对数据库进行任何更改。基于这里潜伏的问题, request.form.get('affected_field_here') 的返回类型(我用来获取联系人 ID 的值)不返回任何值。同样,我尝试使用 request.args / request.values 两者都显示相同的问题

那么另一双眼睛能告诉我我在哪儿搞错了吗?

下面是删除函数

    @app.route('/delete',methods=["GET","POST"])
    def delete():

    conn = sqlite3.connect('contacts.db')

    db = conn.cursor()

    #Get contact_id
    contact_id = request.args.get('contact_id')

    
    db.execute("DELETE FROM contacts WHERE id =?",(contact_id,))
    conn.commit()
    conn.close()

    flash('Contacts removed','success')
    return redirect('/')

index.html 代码在这里

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
{% extends "base.html" %}

{% block title%}Landing Page{% endblock %}

{% block body %}

<div class="container">

    <div class="row">

        <div class="col-md-12">

            <div class="jumbotron p-3">

                <h1>My Contacts <button type="button" class="btn btn-success float-right" data-toggle="modal"
                        data-target="#addcontact"> Add Contact</button></h1>

                        <!--------------------Add Contact Modal placed inside same holder as modalit's for-->
                <div id="addcontact" class="modal fade" role="dialog">
                    <div class="modal-dialog">
                        <div class="modal-content">
                            <div class="modal-header">
                                <h3 class="modal-title">Add Contact</h3>
                            </div>
                            <div class="modal-body">
                                <form action="/add" method="POST" autocomplete="off">
                                    <div class="form-group">
                                        <input  autofocus class="form-control"  autocomplete="off" required type="text" name="fname"  placeholder="Enter first name">
                                    </div>
                                    <div class="form-group">
                                        <input  class="form-control" autocomplete="off" type="text" required name="lname"  placeholder="Enter Surname">
                                    </div>
                                    <div class="form-group">
                                        <input  class="form-control" autocomplete="off" type="number" min="1"  required name="age" placeholder="Enter Age">
                                    </div>
                                    <div class="form-group">
                                        <input  class="form-control" autocomplete="off" type="number"  name="contact" required placeholder="Enter Contact Number">
                                    </div>
                                    <div class="form-group">
                                        <input  class="form-control" autocomplete="off" type="email"  name="email" placeholder="Enter Email address">
                                    </div>

                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                        <button type="submit" class="btn btn-primary">Add Contact</button>
                                    </div>

                                </form>

                            </div>
                            

                        </div>

                    </div>

                </div>

            </div>
            {% with messages = get_flashed_messages(category_filter=["error"]) %}
            {% if messages %}
                {% for  message in messages %}
                <div class="alert alert-danger alert-dismissible">
                    <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
                    <strong>Message: </strong>{{message}}
                  </div>
                {% endfor %}
              {% endif %}
              {% endwith %}

              {% with messages = get_flashed_messages(category_filter=["success"]) %}
                {% if messages %}
                    {% for  message in messages %}
                    <div class="alert alert-success alert-dismissible">
                        <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
                        <strong>Success: </strong>{{message}}
                      </div>
                    {% endfor %}
              {% endif %}
              {% endwith %}
              

            <table class="table table-hover">

                <thead>

                    <tr>
                        <td>ID</td>
                        <td>First Name</td>
                        <td>Surname</td>
                        <td>Age</td>
                        <td>Contact #</td>
                        <td>Email</td>
                        <td>Action</td>
                    </tr>
                </thead>
                <tbody>
                    {% for row in contacts %}
                    <tr>
                        <td>{{row['id']}}</td>
                        <td>{{row['fname']}}</td>
                        <td>{{row["lname"]}}</td>
                        <td>{{row['age']}}</td>
                        <td>{{row['number']}}</td>
                        <td>{{row['email']}}</td>
                      
                        <td><button type="button" class="btn btn-primary" data-toggle="modal"
                            data-target="#editcontact{{row['id']}}">Edit</button>

                            <form style='display:inline;' action="/delete" method="POST">
                                <button type="submit" class="btn btn-danger""
                                onclick="return confirm('Are you sure you want to remove contacts?')">Delete</button></form>
                            
                        </td>

                    </tr>
                </tbody>
                 
                <div class="modal fade" id="editcontact{{row['id']}}" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
                    <div class="modal-dialog">
                      <div class="modal-content">
                        <div class="modal-header">
                          <h5 class="modal-title" id="staticBackdropLabel">Contact information</h5>
                        </div>
                        <div class="modal-body">
                            <form action="/edit" method="POST" autocomplete="off">

                                <div class="form-group">
                                    <input  autofocus class="form-control"  autocomplete="off" required type="hidden" name="contact_id" value="{{row['id']}}" >
                                </div>
                                <div class="form-group">
                                    <input  autofocus class="form-control"  autocomplete="off" required type="text" name="fname_edit" value="{{row['fname']}}" >
                                </div>
                                <div class="form-group">
                                    <input  class="form-control" autocomplete="off" type="text" required name="lname_edit" value="{{row["lname"]}}">
                                </div>
                                <div class="form-group">
                                    <input  class="form-control" autocomplete="off" type="number" min="1"  required name="age_edit" value="{{row['age']}}" >
                                </div>
                                <div class="form-group">
                                    <input  class="form-control" autocomplete="off" type="number"  name="contact_edit" required value="{{row['number']}}" >
                                </div>
                                <div class="form-group">
                                    <input  class="form-control" autocomplete="off" type="email"  name="email_edit" value="{{row['email']}}">
                                </div>

                                <div class="modal-footer">
                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                    <button type="submit" class="btn btn-primary">Save Contact</button>
                                </div>

                            </form>

                        </div>
                      </div>
                    </div>
                  </div>

                  {% endfor %}
                </table>

        </div>


    </div>

</div>

{% endblock %}

appplication.py 的其余部分在这里以防万一它可能有用:

from flask import Flask,render_template,request,flash,redirect,app,url_for,get_flashed_messages
import sqlite3



app = Flask(__name__)
app.secret_key = "this_is_a_secret" #need a key to start app


@app.route('/',"POST"])
def index():
    conn = sqlite3.connect('contacts.db')

    db = conn.cursor()

    contacts = db.execute("SELECT * FROM contacts")

    directory = [] #to store values

    for contact in contacts: #loop through query and append
        directory.append({
            "id": contact[0],"fname": contact[1],"lname": contact[2],"age": contact[3],"number": contact[4],"email": contact[5]})

    return render_template('index.html',contacts = directory) #load dic into html

@app.route('/add',methods=["POST"])
def add():

    conn = sqlite3.connect('contacts.db')

    db = conn.cursor()

    if request.method == "POST": #general back end error checking
            if not request.form.get('fname') or not request.form.get('lname'):
                flash('First name and Surname  are required fields.','error')
                return redirect('/')

            contact_age = request.form.get('age')
            if contact_age.isdigit() == False:
                flash ('Invalid age value','error')
                return redirect('/')
            
            contact_number = request.form.get('contact')
            if contact_number.isdigit() == False:
                flash ('Invalid contact number','error')
                return redirect('/')

            email = request.form.get('email')
            fname = request.form.get('fname')
            lname  =request.form.get('lname')

            db.execute("INSERT INTO contacts (fname,lname,age,number,email) VALUES(?,?,?)",(fname,contact_age,contact_number,email))
            conn.commit() 
            flash ('Updated your contact list','success')

            return redirect('/')

@app.route('/edit',methods=["POST"])
def edit():

    if request.method == "POST":

        conn = sqlite3.connect('contacts.db')

        db = conn.cursor()

        contact_id = request.form.get('contact_id')
        fname_n = request.form.get('fname_edit')
        lname_n = request.form.get('lname_edit')
        age_n = request.form.get('age_edit')
        num_n = request.form.get('contact_edit')
        email_n = request.form.get('email_edit')

        db.execute("""UPDATE contacts SET fname = ?,lname = ?,age = ?,number = ?,email = ? WHERE id= ? 
        """,(fname_n,lname_n,age_n,num_n,email_n,contact_id ))
        conn.commit()
        flash('Contacts updated','success')
        return redirect('/')

@app.route('/delete',"POST"])
def delete():

        conn = sqlite3.connect('contacts.db')

        db = conn.cursor()

        #Get contact_id
        contact_id = request.args.get('contact_id')

        
        db.execute("DELETE FROM contacts WHERE id =?",))
        conn.commit()
        conn.close()

        flash('Contacts removed','success')
        return redirect('/')
        
if __name__ == "__main__":
    app.run(debug=True)

最后是 base.html,其中 index.html 参考

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5paxtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <title>{% block title %} {% endblock %} </title>
</head>
<body>

    <div class="jumbotron p-3">

        <div class="well text-center">
            
            <h1>PRACTICE WEB APPLICATION</h1>
    
        </div>
    
    </div>
    
    {% block body %}

    {% endblock %}
    

    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</html>

编辑:找出答案。在下面的帖子中回答。

解决方法

在删除函数中,我引用了错误的 id,为了解决这个问题,我在删除按钮中添加了一个 name 属性,并在 request.form 函数中引用了它,这使得该函数能够正常工作并反映更改。

希望这能帮助任何陷入类似困境的人。