【问题标题】:PyMySQL where like wildcards surround a variablePyMySQL,其中像通配符围绕一个变量
【发布时间】:2017-11-26 16:35:48
【问题描述】:

这是我的代码:

import pymysql
import pymysql.cursors

# ...

for w in aList: 
  param = w
  cursor.execute("SELECT * FROM test where text like %(p)s", {"p": "%%{}%%".format(param)})
  result_set = cursor.fetchall()
  for row in result_set:
    print(row)

我没有执行任何操作,也没有错误。

与本网站上的类似问题和答案不同,我的问题是关于一个由两个通配符包围的变量。这个变量在循环中每次都会改变,而不是固定的字符串(在这种情况下它将执行)。

提前非常感谢!乔安妮

【问题讨论】:

  • 我没有收到错误消息。我在做:cursor.execute("SELECT * from mysql.db WHERE Host like %(p)s', {'p': '%%{}%%.format(param)') 这将返回 2。如果我将参数更改为 'google',我会得到一个零。
  • 你能打印出param是什么吗?
  • 是的,我可以打印参数。它们是列表中元组中的第一项,即字符串。如:喜欢明星
  • 问题是如果你的参数是一个固定的字符串,你绝对可以让它工作。但是我的参数是一个变量,它会在循环中改变。结果没有给我任何东西。我认为这里的问题是关于出现在类似变量中并被通配符包围的变量的语法问题。
  • 不完全理解 param 是什么。我的 aList 是 [ 'localhost', 'google'] 并且您的代码有效(我确实将测试更改为 mysql.db 并将文本更改为主机)。我认为您需要评估 aList 中的内容,打印语句会有所帮助。你可能会发现它不是一个简单的类型(string、int、float等)。

标签: python mysql variables wildcard pymysql


【解决方案1】:
    import pymysql
    import pymysql.cursors
     ... ... 
     for w in aList:  
         param = w 
         cursor.execute("SELECT * FROM test where text like '%{$param} %')
         result_set = cursor.fetchall()
         for row in result_set:
              print(row)

【讨论】:

  • 感谢您回答我的问题!但是,这段代码实现了与我的代码相同的结果,没有结果也没有错误。
  • 试试这个 SELECT * FROM 测试 where text like '%{}%'".format(param)
  • 感谢您的回答。但它仍然无法正常工作并出现错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“text%”附近使用正确的语法
  • 你能在执行语句之前用动态值打印那个查询吗?
  • 你想要 "select * from test where text like '{}'".format('%{0}%'.format(param)) 编辑:在第一对 {} 周围添加单引号
【解决方案2】:

只要做:

for w in aList: 
  param = w
  cursor.execute("SELECT * FROM test WHERE text LIKE %s", f"%{param}%")
  result_set = cursor.fetchall()
  for row in result_set:
    print(row)

不要使用f"SELECT ..." 中的format(),因为它容易受到 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2013-01-13
    • 2022-01-22
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多