使用 flask_sqlalchemy 将 HTML 表单中的日期插入到 SQlite 数据库中

Insert Date from HTML form into SQlite database using flask_sqlalchemy

下面有点挣扎。

我有一个简单的 HTML 页面,其中包含 3 个表单、用户、开始日期和结束日期。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>date picker</title>
</head>
<body>
<h1>Make A Short URL</h1>
<form action="/" method="post">
    <label for="name">Enter Your Name</label>
    <input type="text" name="name" value="" required>
    <label for="date1">Enter date Beginning </label>
    <input type="date" name="date1" value="" required>
    <label for="date2">Enter date End </label>
    <input type="date" name="date2" value="" required>
    <input type="submit" value="Submit">
</form>

</body>
</html>

然后我使用 Python Flask 框架将其结果插入数据库。我已经获取了表单的值,并且可以在 python 中正确打印这些值。我面临的问题是,当将这些日期值传递给 SQLalchemy 以将它们插入我的数据库时,它插入不正确。

我使用打印语句跟踪了每个阶段,以查看 HTML 表单中的值是否正确。在将其传递到数据库之前,一切似乎都是正确的。

代码正确执行,没有错误,但是数据被插入到数据库中的多行中?这是有原因的吗?

非常感谢任何意见!

插入后的数据库示例:

Python代码:

from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

class database(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user = db.Column(db.String(200))
    startdate = db.Column(db.String(10))
    enddate = db.Column(db.String(10))
@app.route('/', methods = ['POST','GET'],)
def signup():
    if request.method == 'GET':
        return render_template('home.html')
    elif request.method == 'POST':
        name = request.form['name']
        print("The name is '" + name + "'")
        startdate1 = request.form['date1']
        print("The Start date is '" + startdate1 + "'")
        enddate1 = request.form['date2']
        print("The end date is '" + enddate1 + "'")

        dbname = database(user=name)
        dbstartdate = database(startdate=startdate1)
        print(dbstartdate)
        dbenddate = database(enddate=enddate1)
        try:
            db.session.add(dbname)
            db.session.add(dbstartdate)
            db.session.add(dbenddate)
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue adding your task'
        return redirect('/')
if __name__ == '__main__':
    app.run(debug=True)

问题是您调用了 db.session.add() 三次。这使得三个独立的事务。相反,你想要一个单一的记录插入:

@app.route('/', methods = ['POST','GET'],)
def signup():
    if request.method == 'GET':
        return render_template('home.html')

    elif request.method == 'POST':
        name = request.form['name']
        print("The name is '" + name + "'")
        startdate1 = request.form['date1']
        print("The Start date is '" + startdate1 + "'")
        enddate1 = request.form['date2']
        print("The end date is '" + enddate1 + "'")

        record = database(user=name,
                          startdate=startdate1,
                          enddate=enddate1)
        
        try:
            db.session.add(record)
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue adding your task'
        return redirect('/')

换句话说,您想要一次性创建 database class 的 一个实例 并具有所有属性。然后将其作为单个完整记录插入,而不是三个实例,每个实例具有一个属性。

注意事项:

    视图函数最后的
  1. return redirect('/') 是多余的。您的代码不可能达到这一点(它要么抛出异常,要么不抛出异常,但两条路径都已经有自己的 return 值)
  2. 使用通用 except 不是好的做法。这实际上会捕获 KeyboardInterrupt 因此可能很难在长时间的任务中停止您的应用程序。即使您不想处理个别异常,也请确保使用 except Exception: 这样您就可以实际中断代码
  3. 代码中有空格没有坏处。确保使用空行在概念上分隔 functions/classes 等。将所有内容拼凑在一起很难阅读