Flask读取MySQL数据报错:参数未转换完全及SQL语法错误
修复Flask+MySQL柱状图页面的SQL错误
你遇到的两个错误其实都是SQL拼接和参数传递的细节问题,我来一步步帮你解决:
第一个问题:SQL语法错误(1064错误)
看你拼接SQL的代码:
sql = "SELECT cast(sum(Number_employees) as signed) FROM tbldata" sql += "WHERE year = (%s) GROUP BY year, month ORDER BY year, month ASC"
当你拼接这两行的时候,最终的SQL会变成:
SELECT cast(sum(Number_employees) as signed) FROM tbldataWHERE year = (2011) GROUP BY jaar, maand ORDER BY jaar, month ASC
注意tbldata和WHERE之间没有空格,MySQL会把tbldataWHERE当成一个不存在的表名,直接触发语法错误。
修复方法:在第二行的WHERE前面加一个空格:
sql += " WHERE year = (%s) GROUP BY year, month ORDER BY year, month ASC"
第二个问题:参数格式化错误(not all arguments converted)
这个错误通常是因为传递给SQL的参数格式不对。如果你的get_data函数是使用MySQL的驱动(比如pymysql)执行查询,那么参数需要以元组的形式传递,哪怕只有一个参数。
比如你原来的调用是get_data(sql, year),如果year是单个整数,驱动会把它当成一个字符串序列(比如把2011当成['2','0','1','1']),导致参数不匹配。
修复方法:把参数改成元组形式,加个逗号:
data_part = optimize_list(get_data(sql, (year,)))
另外,注意到你错误信息里出现了Nulber_employees(拼写错误,少了个'm'),检查一下代码里的字段名是否和数据库里的一致,确保是Number_employees,避免字段不存在的错误。
修正后的完整代码
@app.route("/grafiek") def chart(): data = [] years = optimize_list(get_data("SELECT DISTINCT year FROM tbldata")) print(years) # 修复SQL拼接的空格问题 sql = "SELECT cast(sum(Number_employees) as signed) FROM tbldata" sql += " WHERE year = (%s) GROUP BY year, month ORDER BY year, month ASC" print(sql) for year in years: # 修复参数传递为元组 data_part = optimize_list(get_data(sql, (year,))) data.append(data_part) print(data) labels = optimize_list(get_data("SELECT DISTINCT month FROM faillisementen.tbldata")) titels= "Number Employees in faillisementen" colors = ['red', 'green'] return render_template("chart.html", data=data, labels=labels)
这样修改后,应该就能解决你遇到的两个错误了。
内容的提问来源于stack exchange,提问作者Brian Thery
相关产品推荐
相关产品推荐

