Python 如何将flask应用程序连接到SQLite3数据库?

Python 如何将flask应用程序连接到SQLite3数据库?,python,database,flask,sqlite,Python,Database,Flask,Sqlite,嗨,我正在尝试创建一个客户反馈表;我已经成功地创建了我需要的页面,但是我很难将我的应用程序连接到我的SQLite3数据库 因此,在我的代码python代码中,我试图从客户反馈表单收集数据,并将其保存在数据库中 在反馈表中,他们将被提示输入姓名,从下拉框中选择一些答案,并在最后写下评论 答案将保存在数据库中(供将来参考,如报告等),用户将被重定向回主页,在那里他们将能够看到自己的姓名和评论(取自反馈表) 我看过sqlite3的教程,它很容易理解和执行(对我来说比MySQL容易得多),但我遗漏了一些

嗨,我正在尝试创建一个客户反馈表;我已经成功地创建了我需要的页面,但是我很难将我的应用程序连接到我的SQLite3数据库

因此,在我的代码python代码中,我试图从客户反馈表单收集数据,并将其保存在数据库中

在反馈表中,他们将被提示输入姓名,从下拉框中选择一些答案,并在最后写下评论

答案将保存在数据库中(供将来参考,如报告等),用户将被重定向回主页,在那里他们将能够看到自己的姓名和评论(取自反馈表)

我看过sqlite3的教程,它很容易理解和执行(对我来说比MySQL容易得多),但我遗漏了一些东西,因为它无法连接到我的数据库

我的python代码:

from flask import Flask, render_template, redirect, url_for, request, session, flash, g
from functools import wraps
import sqlite3

app = Flask(__name__)
app.secret_key = "random_character_generator" # this would be random or anything the developer wants
app.database = "gymdatabase.db"

conn = sqlite3.connect(app.database)
c = conn.cursor()

def connect_db():
    return sqlite3.connect(app.database)

@app.route('/')
def home():
    g.db = connect_db()
    cur = g.db.execute('select * from posts')
    posts = [dict(name=row[0], welcome=row[1], equipment=row[2], cleanliness=row[3], interaction=row[4], comments=row[5], contact=row[6]) for row in cur.fetchall()]
    g.db.close()
    return render_template('gym_index.html', posts=posts)

@app.route('/feedback', methods=['POST'])
def feedback():
    return render_template('gym_feedback.html')

@app.route('/process', methods=['GET', 'POST'])
def process():
    g.db = connect_db()
    name = request.form['name']
    welcome = request.form['welcome']
    equipment = request.form['equipment']
    cleanliness = request.form['cleanliness']
    interaction = request.form['interaction']
    comment = request.form['comment']
    contact = request.form['yes_no']
    conn.commit()
    cur = g.db.execute(select * from posts)
    posts = [dict(name=row[0], welcome=row[1], equipment=row[2], cleanliness=row[3], interaction=row[4], comments=row[5], contact=row[6]) for row in cur.fetchall()]
    g.db.close()
    return redirect(url_for('home', posts=posts))   
当我尝试提交反馈表时,我得到: sqlite3.ProgrammingError:在线程中创建的SQLite对象只能在同一线程中使用


我可以根据要求上传html文件;我不太确定我的python文件是否有空间这样做。

我认为这是由于您的
process()
函数中的行
conn.commit()
造成的。当Flask首次启动时,您声明了
conn=sqlite3.connect(app.database)
,但是使用
@app.route(…)
函数decorator定义的每个函数都会在不同的线程中被调用,以响应HTTP请求(如前面提到的函数decorator中所定义的)。您可能希望执行以下操作:

@app.route('/process', methods=['GET', 'POST'])
def process():
    ...
    db = connect_db()
    cur = db.cursor()
    cur.execute("select * from posts")
    results = cur.fetchall()
    ...
有关更多文档,请参见此链接:


如果您提供有关代码失败的更多上下文,我可以编辑我的答案。

您说的“它无法连接”是什么意思?会发生什么?你有什么错误?(请注意,在这段代码中,您从来没有在数据库中插入任何内容。)谢谢我尝试了您的建议,它仍然没有连接到我的数据库(传递的信息不会发送到我的数据库)。当我按下提交按钮时,它会重定向到主页,但没有任何内容被发布或存储到数据库中。如果您正在对数据库进行某种更新,则需要在您的
cur.execute(…)调用后放置
cur.commit()
调用。在我的示例中,您所做的只是从数据库中检索每一行并将其存储在results变量中;我设法创建了一个名为posts的空表,一旦用户填写了反馈表,数据就应该发送到数据库。应该从数据库中获取用户的姓名和他们的评论,并在开始时重定向到主页。如果可能,我是否可以向您发送/通过电子邮件发送我所拥有的信息?也许您可以看到我可能出错的地方。。