Flask-Mysql更新数据时类型错误

Flask-Mysql type error when update data

当我使用 flask 和 package flask-mysql.

编写网站时,我遇到了一个奇怪的错误

这里是bug函数的代码:

@app.route('/calendar/editeventtitle',methods=['POST'])
def editeventtitle():
    if not session.get('logged_in'):
      abort(401)

    try:
      id = request.form.get('id',type=int)
      title = request.form['title']
      color = request.form['color']
      delete = request.form.get('delete')
    except:
      pass

    conn = mysql.connect()
    cursor = conn.cursor()
    print(id,type(id))
    # try:
    #   print(delete,type(delete))
    # except:
    #   pass

    if id and delete:
        cursor.execute('delete from events where id = %d',id)
        conn.commit()
        flash('Event canceled!')
        return redirect(url_for('calendar'))
    elif id and title and color:
        cursor.execute('update events set title = %s, color = %s where id = %d',(title,color,id))
        conn.commit()
        flash('Event updated!')
        return redirect(url_for('calendar'))

当我post这个页面的四个变量。我成功地得到了它们。 print(id,type(id)) 的结果是:

6 <class 'int'>

我们看到它确实是一个整数,但是当代码开始从数据库更新或删除数据时,错误信息如下:

TypeError: %d format: a number is required, not str

真的不知道原因=-=,谁能帮帮我?谢谢。

PS: Python3.6.1, Flask 0.12.2, Flask-Mysql 1.4.0

您应该对像这样执行的 SQL 查询中的所有参数使用 %s。原因是 flask-mysql(或它所依赖的任何 MySQL Python 库)会在进行字符串插值之前将您给它的参数 title, color, id 转换为字符串。

它这样做的原因是因为它还会检查您在查询中使用的任何参数是否是预期类型的​​实际合理参数,例如整数、SQL 标识符,而不是 SQL 的片段可能会破坏您的查询的代码。 (这用于获得对数据库的未授权访问,称为 SQL 注入)。对于每个值,它将检查类型并决定如何将其转换为 SQL 表示。

这就是为什么您不需要在参数 titlecolor 周围加上单引号的原因。 SQL 库将参数标识为字符串并添加引号,同时转义这些字符串中包含的任何单引号。这也是为什么您可以在此处传递 Python 对象,如 datetime。该对象将被正确地转换为相应 SQL 类型的文字表示。