【问题标题】:Sqlite insert in FlaskSqlite 在 Flask 中插入
【发布时间】:2015-07-14 09:20:08
【问题描述】:

我有一个包含一些 Python 代码和 HTML 模板的 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>

它以我想要的格式(整数)输出下拉列表,但是,例如,假设 quiz #1 和 student #1 的成绩为 100,然后将它们作为

输入到 SQLite

(2, u"{'ID': 1}", u"{'ID': 1}", 100.0)

我怎样才能得到这个输出?:

(2,1,1,100.0)

【问题讨论】:

  • 您希望“此输出”出现在哪里?您要改进哪些具体代码?
  • @amccormack 我只是想让它们以这种格式输入数据库。我正在尝试改进 g.db.execute 语句

标签: python sqlite flask jinja2


【解决方案1】:

在将值发送到数据库之前,您需要将它们转换为正确的类型。 request.form dict 提供了一个 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 等表单库为您解析、转换和验证数据会更容易(也更安全)。还可以考虑使用 Flask-SQLAlchemy 等 ORM,而不是编写原始 SQL 语句。

【讨论】:

    【解决方案2】:

    问题出在 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 %}
    

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2020-10-16
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2012-03-27
      相关资源
      最近更新 更多