我该如何正确地做到这一点:
我想做这样的查询:
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
任何帮助非常感谢!
答案 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))