gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:34:08 25 4
gpt4 key购买 nike

当我用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com