我基本上使用以下代码使用Python 3.6和PyMySQL删除现有表,并使用MySQL 5.7数据库:
connection = pymysql.connect(
host=host,
user=username,
password=password,
db=database,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
table_name = "video_playback_statistics"
sql = "DROP TABLE IF EXISTS %s"
params = (table_name,)
with connection.cursor() as cursor:
cursor.execute(sql, params)
我收到以下错误:
pymysql.err.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在第1行''video_playback_statistics''附近使用正确的语法/ p>
我已经使用更多参数成功执行了其他更复杂的SQL语句,但是这个简单的SQL语句不起作用。
当我在没有参数化的情况下运行SQL命令时,它可以正常工作:
cursor.execute('DROP TABLE IF EXISTS video_playback_statistics')
我看过以下问题:
但是这些类型的查询似乎运行良好。
我也见过这个:
但是这里的表名直接写入字符串。
答案 0 :(得分:0)
根据this comment,显然不可能对表名或列名进行参数化。适配器由于某种原因,为该值插入两个双引号,这会导致语法错误。
两种可能的解决方案是:
对参数使用反斜杠转义:
sql = "DROP TABLE IF EXISTS `%s`"
使用Python字符串格式:
sql = "DROP TABLE IF EXISTS {}".format(table_name)
对于值(例如在INSERT
或WHERE
语句中),您仍应使用参数化。