简单的“create”或“drop table”在pymysql和参数替换中失败

lnxxn5zx  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(410)

我基本上是使用以下代码删除一个使用Python3.6和pymysql的现有表,其中包含一个MySQL5.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行“视频\u播放\u统计”附近使用的正确语法
我已经成功地用更多参数执行了其他更复杂的sql语句,但是这个简单的语句不起作用。
当我在没有参数化的情况下运行sql命令时,它可以正常工作:

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

我看了以下问题:
1064,“您的sql语法有错误;…”python mysql
pymysql返回错误sql语法
但这类查询似乎工作正常。
我也看到过:
python-mysql-update语句
但在这里,表名直接写入字符串。

bvuwiixz

bvuwiixz1#

显然,根据这条评论,表名或列名的参数化是不可能的。由于某种原因,适配器为值插入了两个双引号,这会导致语法错误。
两种可能的解决办法是:
对参数使用反斜杠转义:

sql = "DROP TABLE IF EXISTS `%s`"

使用python字符串格式:

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

对于值(例如 INSERT 或者 WHERE 语句),仍然应该使用参数化。

相关问题