Python中含变量的SQL查询字符串格式化报错求助
解决SQL字符串格式化时的TypeError问题
你猜得完全没错!问题就出在column1 like '%object%'里的单个%上——Python的旧式字符串格式化(%运算符)会把%识别为占位符标识,所以它会把%object%里的%o、%b都当成需要填充的参数位置,而你只传了一个x,自然就触发not enough arguments的错误了。
给你几个可行的解决方案,按推荐程度排序:
1. 优先使用参数化查询(最安全)
直接拼接SQL字符串不仅容易出格式化问题,还存在SQL注入的风险,所以强烈推荐用数据库API自带的参数绑定功能。不同数据库的占位符语法略有不同,举几个常见例子:
- SQLite:用
?作为占位符
import sqlite3 conn = sqlite3.connect("your_database.db") cursor = conn.cursor() # 把参数放在execute的第二个参数里,是个元组 cursor.execute(""" select * from schema.table where column1 like '%object%' and column2 = ? """, (x,))
- MySQL/PostgreSQL:通常用
%s作为占位符(注意这里的%s是数据库驱动处理的,不是Python的格式化占位符)
import psycopg2 # PostgreSQL示例 conn = psycopg2.connect("dbname=your_db user=your_user") cursor = conn.cursor() cursor.execute(""" select * from schema.table where column1 like '%object%' and column2 = %s """, (x,))
2. 转义SQL里的百分号
如果你非要用Python的%格式化,就把SQL中需要保留的%写成%%,这样Python就会把它解析为普通的百分号字符:
sql_string = """ select * from schema.table where column1 like '%%object%%' and column2 = '%s' """ % (x,)
注意最后(x,)里的逗号,是为了确保这是一个元组,避免单个参数时被解析成其他类型导致的问题。
3. 使用str.format()方法
这种方式的占位符是{},不会和SQL的%冲突,可读性也不错:
sql_string = """ select * from schema.table where column1 like '%object%' and column2 = '{}' """.format(x)
总之,能不用字符串拼接就尽量不用,参数化查询才是更安全、更省心的做法~
内容的提问来源于stack exchange,提问作者Macterror
相关产品推荐
相关产品推荐

