Flask 中的 SQLite 插入
Sqlite insert in Flask
我有一个 html 模板,其中包含一些 Python 代码和 HTML 模板。这是下面的示例。
Python:
cur1 = g.db.execute('select ID from Students')
students = [dict(ID=row[0]) for row in cur1.fetchall()]
cur2 = g.db.execute('select ID from Quizzes')
quizzes = [dict(ID=row[0]) for row in cur2.fetchall()]
if request.method == 'POST':
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into Results (quiz,student,grade) values '\
'(?,?,?)',[request.form['Quiz'],
request.form['Student'],
request.form['grade']])
g.db.commit()
return render_template('add_result.html',students=students,quizzes=quizzes)
HTML:
<form action="{{ url_for('add_result') }}" method=post>
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student }}">{{ student.ID }}</option>
{% endfor %}
</select>
<input type="number" name="grade">
<input type="submit" value=Submit>
</form>
以我想要的格式(整数)输出下拉列表,但是,例如,假设值测验 #1 和学生 #1 的成绩为 100,然后将它们作为
(2, u"{'ID': 1}", u"{'ID': 1}", 100.0)
我怎样才能得到这个输出?:
(2,1,1,100.0)
在将值发送到数据库之前,您需要将它们转换为正确的类型。 request.form
字典提供了一个 get
方法,可以转换值或引发错误。
g.db.execute(
'insert into Results (quiz,student,grade) values (?,?,?)',
(
request.form.get('Quiz', type=int),
request.form.get('Student', type=int),
request.form.get('grade', type=float)
)
)
在较长的 运行 中,使用诸如 Flask-WTF to parse, convert, and validate the data for you. Also consider using an ORM such as Flask-SQLAlchemy 之类的表单库比编写原始 SQL 语句要容易得多(也更安全)。
问题出在 HTML:
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student }}">{{ student.ID }}</option>
{% endfor %}
我将 "quiz" 和 "student" 作为 s,quiz.ID 和 student.ID 在值中显示为文本。这是表单返回的选项值。
应该是:
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz.ID }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student.ID }}">{{ student.ID }}</option>
{% endfor %}
我有一个 html 模板,其中包含一些 Python 代码和 HTML 模板。这是下面的示例。
Python:
cur1 = g.db.execute('select ID from Students')
students = [dict(ID=row[0]) for row in cur1.fetchall()]
cur2 = g.db.execute('select ID from Quizzes')
quizzes = [dict(ID=row[0]) for row in cur2.fetchall()]
if request.method == 'POST':
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into Results (quiz,student,grade) values '\
'(?,?,?)',[request.form['Quiz'],
request.form['Student'],
request.form['grade']])
g.db.commit()
return render_template('add_result.html',students=students,quizzes=quizzes)
HTML:
<form action="{{ url_for('add_result') }}" method=post>
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student }}">{{ student.ID }}</option>
{% endfor %}
</select>
<input type="number" name="grade">
<input type="submit" value=Submit>
</form>
以我想要的格式(整数)输出下拉列表,但是,例如,假设值测验 #1 和学生 #1 的成绩为 100,然后将它们作为
(2, u"{'ID': 1}", u"{'ID': 1}", 100.0)
我怎样才能得到这个输出?:
(2,1,1,100.0)
在将值发送到数据库之前,您需要将它们转换为正确的类型。 request.form
字典提供了一个 get
方法,可以转换值或引发错误。
g.db.execute(
'insert into Results (quiz,student,grade) values (?,?,?)',
(
request.form.get('Quiz', type=int),
request.form.get('Student', type=int),
request.form.get('grade', type=float)
)
)
在较长的 运行 中,使用诸如 Flask-WTF to parse, convert, and validate the data for you. Also consider using an ORM such as Flask-SQLAlchemy 之类的表单库比编写原始 SQL 语句要容易得多(也更安全)。
问题出在 HTML:
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student }}">{{ student.ID }}</option>
{% endfor %}
我将 "quiz" 和 "student" 作为 s,quiz.ID 和 student.ID 在值中显示为文本。这是表单返回的选项值。
应该是:
<select name="Quiz">
{% for quiz in quizzes %}
<option value="{{ quiz.ID }}">{{ quiz.ID }}</option>
{% endfor %}
</select>
<select name="Student">
{% for student in students %}
<option value="{{ student.ID }}">{{ student.ID }}</option>
{% endfor %}