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

Posted

技术标签:

【中文标题】使用 flask_sqlalchemy 将 HTML 表单中的日期插入 SQlite 数据库【英文标题】:Insert Date from HTML form into SQlite database using flask_sqlalchemy 【发布时间】:2021-12-05 17:13:13 【问题描述】:

在下面有点挣扎。

我有一个简单的 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() 被调用了 3 次,而不是在一次调用中传递所有 3 个值。另外,您不会因代码中的空行而被征税 - 请不要将所有内容拼凑在一起,因为它真的很难阅读 谢谢,对于代码格式的道歉将考虑在内。 【参考方案1】:

问题是您调用了三次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 类的一个实例。然后将其作为单个完整记录插入,而不是三个实例,每个实例一个属性。

注意事项:

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

【讨论】:

这是完美的,谢谢。我的菜鸟错误!

以上是关于使用 flask_sqlalchemy 将 HTML 表单中的日期插入 SQlite 数据库的主要内容,如果未能解决你的问题,请参考以下文章

No module named 'flask_sqlalchemy'

flask_sqlalchemy和sqlalchemy联系区别及其使用方式

Python中使用flask_sqlalchemy实现分页效果方法详解

flask_sqlalchemy join的正确使用方法

flask_sqlalchemy的使用

text 使用Flask_SQLAlchemy连接到Azure SQL