Flask 和 sqlite:无法将值插入数据库

Flask and sqlite: Failing to insert values into the database

我在 main.py 文件中有以下代码。它似乎在所有情况下都有效,请注意,当我打印出 user_details 时,它会打印出元组:test,test,test(填写到表格中),因此 post 请求有效。但是,不知何故,它 并未实际写入数据库

错误的主要性质:插入没有发生。

有人可以发现我的代码中的错误吗?

#ADD COMMENT GET POST REQUEST FUNCTION
@app.route('/add',methods=['GET','POST'])
def addcomment():
    if request.method=="GET":
        return render_template('addcomment.html')
    else:
        user_details=(
        request.form['title'],
        request.form['name'],
        request.form['comment']
            )
        #print(user_details)
        insertcomment(user_details)
        return render_template('addsuccess.html')

#INSERTING comments into the actual database
def insertcomment(user_details):
        connie = sqlite3.connect(db_locale)
        c=connie.cursor()
        sql_insert_string='INSERT INTO comments (title, name, comment) VALUES (?,?,?)';
        c.execute(sql_insert_string,user_details)
        connie.commit
        connie.close()
        print(user_details)


def query_comments():
        connie = sqlite3.connect(db_locale)
        c=connie.cursor()
        c.execute("""
        SELECT * FROM comments  

        """)
        userdata=c.fetchall()
        return userdata

我怀疑这些行有问题(即第二个函数) 插入评论()

    connie = sqlite3.connect(db_locale)
    c=connie.cursor()
    sql_insert_string='INSERT INTO comments (title, name, comment) VALUES (?,?,?)';
    c.execute(sql_insert_string,user_details)

据我所知,def addcomment(): 函数工作正常,在单击提交时呈现并返回正确的 html 页面。

在 html 方面,我能想到的唯一可能导致错误的是字段的顺序。在数据库中,字段是姓名、标题、评论(按此顺序),但在 HTML 和查询中,它们是标题、姓名、评论(按指定的顺序)。

作为参考,HTML 文件(接受该数据的表格)如下:

  <div class="form-group">
    <label for="exampleInputEmail1">Title (or catchy caption!)</label>
    <input type="text" class="form-control" id="title" name="title" aria-describedby="emailHelp">
  </div>


  <div class="form-group">
    <label for="exampleInputPassword1">Name</label>
    <input type="text" class="form-control" id="name" name="name">
  </div>
  

  <div class="form-group">
  <label for="exampleFormControlTextarea1">Add your amazing answer here:</label>
  <textarea class="form-control" id="comment" name="comment" rows="3"></textarea>
  </div>


  </div>
  <div class="form-group">

  <button type="submit" class="btn btn-primary">Submit</button>
</form>

在首页,数据呈现如下。如您所见,我不得不调换数字,如 2= title 1=name 和 3 = comment

{% for user in user_data%}
    <tr>
      <th scope="row">{{user[0]}}</th>
      <td>{{user[2]}}</td>
      <td>{{user[1]}}</td>
      <td>{{user[3]}}</td>
    </tr>
    {% endfor %}

以上是否与错误有关,我不知道(顺序)...但我想不出为什么。

最后,这里是 table 填充 .py 文件。您会注意到有一个额外的字段 - 日期。同样,这可能是一个因素吗?

#populate database file
import sqlite3
db_locale='users.db'

connie=sqlite3.connect(db_locale)
c=connie.cursor() #use this to create commands

#creating a multi-line instruction
c.execute("""
INSERT INTO comments (name,title,comment,date_posted) VALUES
('Ruth Marvin','42','Yeah.Someone was going to say 42','20th July 2050'),
('Jonathan Peter','Meaning?','Surely we need to first define meaning','13th August 2050')

    """)

connie.commit()
connie.close()

谁能解释为什么数据没有 POSTED/INSERTED 进入数据库。

您需要使用标准库中的 Python 的 format() 函数来格式化 SQL 插入字符串。

您的代码:

sql_insert_string='INSERT INTO comments (title, name, comment) VALUES (?,?,?)';

应该是这样的:

sql_insert_string='INSERT INTO comments (title, name, comment) VALUES ({}, {}, {})'.format(user_details[0], user_details[1], user_details[2])

然后在您的 c.execute 行中将 sql_insert_string 作为参数传递。此外,我发现 flask-sqlalchemy 模块可以避免无数麻烦,但感谢您花时间学习 SQL 并像这样编写代码。

错误在函数 insertcomment() 中。您缺少 commit:

的括号
connie.commit

只需更改为:

connie.commit()

这会将更改保存到数据库中。其他一切看起来都很好,包括数据库查询。您使用参数化查询是正确的。

sql_insert_string="INSERT INTO comments (title, name, comment) VALUES (%s,%s,%s)"
c.execute(sql_insert_string, user_details)
connie.commit()

这应该有效。将您的数据库操作包装成 try,except 块以找出您的查询有什么问题。

try:
  sql_insert_string="INSERT INTO comments (title, name, comment) VALUES (%s,%s,%s)"
  c.execute(sql_insert_string, user_details)
  connie.commit()
except Exception as e:
  print(e)