使用PyMySQL和参数替换,简单的“CREATE”或“DROP TABLE”失败

时间:2018-04-24 09:47:26

标签: python mysql pymysql

我基本上使用以下代码使用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''附近使用正确的语法

我已经使用更多参数成功执行了其他更复杂的SQL语句,但是这个简单的SQL语句不起作用。

当我在没有参数化的情况下运行SQL命令时,它可以正常工作:

cursor.execute('DROP TABLE IF EXISTS video_playback_statistics')

我看过以下问题:

但是这些类型的查询似乎运行良好。

我也见过这个:

但是这里的表名直接写入字符串。

1 个答案:

答案 0 :(得分:0)

根据this comment,显然不可能对表名或列名进行参数化。适配器由于某种原因,为该值插入两个双引号,这会导致语法错误。

两种可能的解决方案是:

  1. 对参数使用反斜杠转义:

    sql = "DROP TABLE IF EXISTS `%s`"
    
  2. 使用Python字符串格式:

    sql = "DROP TABLE IF EXISTS {}".format(table_name)
    
  3. 对于值(例如在INSERTWHERE语句中),您仍应使用参数化。