我使用MySQLDB从数据库中查询一些数据,当在sql中使用时,我对sql语句感到困惑。
因为我喜欢使用,所以我在sql下面构造,可以得到正确的结果。
cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%",))
现在我想将b列变为如下变量。它不会得到
cur.execute("SELECT a FROM table WHERE %s like %s limit 0,10", ("b", "%"+"ccc"+"%"))
我打破了很多网站,但没有得到结果。我有点头晕。
答案 0 :(得分:1)
在db-api中,参数仅用于值,不适用于列或查询的其他部分。您需要使用普通字符串替换来插入它。
column = 'b'
query = "SELECT a FROM table WHERE {} like %s limit 0,10".format(column)
cur.execute(query, ("%"+"ccc"+"%",))
您也可以通过在参数中使用format
来使这一点更好:
cur.execute(query, ("%{}%".format("ccc",))
答案 1 :(得分:0)
您可能需要从
重写变量替换cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%"))
到
cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%",))
请注意添加最后一个空元素的尾随逗号,以确保声明变量的元组长于1个元素。在这个例子中,字符串连接甚至不是必需的,这段代码说:
cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%ccc%",))
答案 2 :(得分:0)
第二个查询不起作用的原因是参数化查询中的替换产生的查询如下所示:
select a from table where 'b' like '%ccc%' limit 0,10
'b'
不是引用表,而是引用静态字符串'b'
。如果您将字符串abcccba
传递给查询,则会得到一个选择所有行的查询:
cur.execute("SELECT a FROM table WHERE %s like %s limit 0,10", ("abcccba", "%"+"ccc"+"%"))
生成查询:
SELECT a FROM table WHERE 'abcccba' like '%ccc%' limit 0,10
通过此,您现在应该能够看到第二个查询返回空结果集的原因:字符串b
与%ccc%
不同,因此不会返回任何行。
因此,您无法使用参数化查询设置表名或列名,您必须使用普通的Python字符串代码:
cur.execute("SELECT a FROM table WHERE {} like %s limit 0,10".format('b'), ("abcccba", "%"+"ccc"+"%"))
将生成并执行查询:
SELECT a FROM table WHERE b like '%ccc%' limit 0,10