使用pymysql将数据库名称作为参数传递给sql语句

问题描述 投票:0回答:2

我想传递数据库作为参数

sql = 'SELECT * FROM %s.table1'
values = 'db-1'

cursor.execute(sql, values)

问题是%s是使用单引号转义的,它会产生错误:

错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在第1行''qualys_scan'.new_table'附近使用正确的语法

另一方面使用简单的参数替换:

'SELECT * FROM%s.table1'.format(values)

可以通过sql注入来利用。

有任何建议如何处理这个?不同的mysql模块的方法也会有所帮助

此致,Jano

python pymysql
2个回答
0
投票

如果值(在本例中为db名称)来自不受信任的源,则SQL注入只是一个问题,即使这样,您也可以手动清理数据库名称。

这就是说,将db名称传递给connection对象可能更容易 - 最终保留db_name:connection的映射以避免每次重新打开新连接。


-1
投票

你可以做类似下面的事情

values = 'db-1'

sql = 'SELECT * from {val}.table1'.format(val=values)
print(sql) # 'SELECT * from db-1.table1'

然后你可以做conn.execute(sql)

多个参数的另一个例子:

query_string = 'SELECT * from {tablename} WHERE DATE(End_time) = "{date}"'.format(tablename=table,date=date)

在你的情况下:

sql = 'SELECT * FROM {database}.table1'
values = 'db-1'
cursor.execute(sql.format(database=values))
© www.soinside.com 2019 - 2024. All rights reserved.