如何在Python pymysql的查询语句中插入数据库名?
解决pymysql中动态插入数据库名的语法错误问题
问题出在你误用了cursor.execute的参数化功能——这个功能是用来处理SQL查询中的值参数(比如WHERE id = %s里的具体数值),它会自动给字符串参数加上单引号,导致生成的SQL变成'my_database'.table_a,这不符合MySQL对数据库名的语法要求(数据库名应该用反引号包裹,或者无特殊字符时直接写)。
正确的实现方式
因为数据库名属于SQL的标识符(而非值),不能用execute的参数化来替换,需要用字符串格式化先拼接好SQL语句,再执行:
方法1:使用f-string(Python 3.6+)
cursor = connection.cursor() db_name = "my_database" query = f""" SELECT * FROM `{db_name}`.table_a """ result = cursor.execute(query)
方法2:使用str.format()
cursor = connection.cursor() query = """ SELECT * FROM `{}`.table_a """ result = cursor.execute(query.format("my_database"))
重要注意事项
如果数据库名来自用户输入或不可信来源,一定要做严格的合法性校验(比如只允许字母、数字、下划线),避免SQL注入风险——字符串格式化没有参数化的安全防护能力,直接拼接不可信内容会导致安全问题。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

