使用 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联系区别及其使用方式