【问题标题】:Simple "CREATE" or "DROP TABLE" fails with PyMySQL and parameter replacement简单的“CREATE”或“DROP TABLE”因 PyMySQL 和参数替换而失败
【发布时间】:2018-10-04 12:35:08
【问题描述】:

我基本上使用以下代码来删除使用 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 命令时,它工作正常:

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

我查看了以下问题:

但这些类型的查询似乎工作正常。

我也看过这个:

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

【问题讨论】:

    标签: python mysql pymysql


    【解决方案1】:

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

    两种可能的解决方案是:

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

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

      sql = "DROP TABLE IF EXISTS {}".format(table_name)
      

    对于值(例如在INSERTWHERE 语句中),您仍应使用参数化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2014-12-02
      • 1970-01-01
      相关资源
      最近更新 更多