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

标签 python mysql flask flask-mysql

当我用 flask 和 package flask-mysql 编写网站时,我遇到了一个奇怪的错误。

这是错误函数的代码:

@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'))

当我将四个变量发布到此页面时。我成功地得到了它们。 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 注入(inject))。对于每个值,它将检查类型并决定如何将其转换为 SQL 表示。

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

关于python - Flask-Mysql更新数据时类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46093103/

相关文章:

python - 如何计算矩阵中每个单元格占列总和的比例?

python - microcrontroller 输出到 python cgi 脚本

PHP SQL ON DUPLICATE KEY 没有影响

mysql - 插入主键 UUID_SHORT 时出现重复条目​​ mysql

python - 模块未找到错误 : No module named 'MySQLdb'

python - Scrapy:自定义回调不起作用

python - 连接关闭时 try/finally 阻塞的 Tornado 生成器引擎中的内存泄漏

mysql - 从两列的总和中选择顶部 x

javascript - 使用 Flask 变量作为 highcharts 的数据源

python - Flask 中的基本 HTTP 身份验证 AttributeError : 'NoneType' error