如何在Python中使用mysqldb格式化字符串?

时间:2010-03-29 13:47:51

标签: python string mysql

我该如何正确地做到这一点:

我想做这样的查询:

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()

一切正常但%s%s的顺序并没有正确输入字符串。它将两个替换放在它们周围的引号中。

所以最终结果如下:

ORDER BY 'somecol' 'DESC'

哪个错误应该是:

ORDER BY somecol DESC

任何帮助非常感谢!

4 个答案:

答案 0 :(得分:9)

答案 1 :(得分:6)

查询字符串中的%s占位符是为参数保留的。 '%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注入的可能性

答案 2 :(得分:0)

并非SQL查询的所有部分都可以参数化。例如,DESC关键字不是 一个参数。试试

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

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

答案 3 :(得分:-1)

你可以尝试这个......

query = """SELECT * FROM sometable 
                    order by {0} {1} 
                    limit {2}, {3};"""

sortname = 'somecol'
sortorder = 'DESC'
limit1 = 'limit1'
limit2 = 'limit2'

print(query.format(sortname, sortorder, limit1, limit2))