如何在Python中格式化字符串以查询mysqldb?

6 投票
4 回答
13377 浏览
提问于 2025-04-15 20:59

我该怎么正确地做这个:

我想执行一个这样的查询:

query = """SELECT * FROM sometable 
                    order by %s %s 
                    limit %s, %s;"""
conn = app_globals.pool.connection()
cur = conn.cursor()
cur.execute(query, (sortname, sortorder, limit1, limit2) ) 
results = cur.fetchall()

一切都正常,但“order by %s %s”这个部分没有正确排序字符串。它把两个替换的内容都加上了引号。

所以最后变成了这样:

ORDER BY 'somecol' 'DESC'

这是错误的,应该是:

ORDER BY somecol DESC

非常感谢任何帮助!

4 个回答

0

并不是SQL查询的所有部分都可以用参数来替代。比如,DESC这个关键词就不能作为参数。你可以试试

query = """SELECT * FROM sometable 
                    order by %s """ + sortorder + """
                    limit %s, %s"""

cur.execute(query, (sortname, limit1, limit2) ) 
6

在查询字符串中,%s 占位符是用来表示参数的。而在 'order by %s %s' 这个句子中的 %s 并不是参数。你应该把查询字符串分成两个步骤来写:

query = """SELECT * FROM sometable order by %s %s limit %%s, %%s;"""
query = query % ('somecol', 'DESC')
conn = app_globals.pool.connection()
cur = conn.cursor()
cur.execute(query, (limit1, limit2) ) 
results = cur.fetchall()

记得先过滤第一个替换,以防止 SQL 注入的风险。

撰写回答