我正在尝试使用python在mysql中创建和执行一个存储过程
我从中读取的表格如下所示:
这是用于创建进程的命令,运行正常:
new_conn = engine.raw_connection()
mycursor = new_conn.cursor()
mycursor.execute('''CREATE PROCEDURE getAvgPerCity
(
IN city VARCHAR(64),
IN des_table VARCHAR(255)
)
BEGIN
SET @Sql = CONCAT('INSERT INTO ',des_table,'(location,avg_value,insert_time)
select location,avg_per_city, NOW() AS insert_time from
(
select location,avg(total) as avg_per_city from
(
select location,date(risetime) as dt_day,count(*) as total
from
orbital_data
group by location,dt_day
) as q1
group by location) as q2
WHERE location = ',city,';');
PREPARE stmt FROM @Sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ''')
然后,我把这个过程称为:
args = ['Haifa', 'city_stats_Haifa']
mycursor.callproc('getAvgPerCity', args)
然后代码崩溃,出现以下错误:
<;MySQLdb._exceptions.OperationalError:(1054,“where子句”中的未知列'Haifa'”>
所有列名都是原始名称,没有别名。我做错了什么
在城市名称周围使用双引号
如果未选中城市名称,则这可能是sql注入的入口点,因此可以使用prepare statemnts with oarameters
正如在评论中提到的,SQL中缺少城市周围的引号。但是,您不应该添加引号,而应该让语句使用参数,以避免SQL注入
不幸的是,您不能为表名使用占位符。最好的办法是在它周围加上反勾,以防它包含特殊字符
相关问题 更多 >
编程相关推荐