Python->MySQL“从品牌中选择*,其中text='L'Orial'”(在搜索文本中引用)

Python->MySQL“从品牌中选择*,其中text='L'Orial'”(在搜索文本中引用),python,sql,Python,Sql,在Python3.9中,我尝试执行如下MySql查询 从品牌中选择*,其中text='L'。 它在phpMyAdmin中运行良好,但在python中对所有文本(包括引号)都失败 brand = "L'Orial" where = f"text='{brand}'" brand_pk_id = self.getPrimaryKeyIfExistInTable('brand', where) def getPrimaryKeyIfExistInTable(s

在Python3.9中,我尝试执行如下MySql查询 从品牌中选择*,其中text='L'。 它在phpMyAdmin中运行良好,但在python中对所有文本(包括引号)都失败

brand = "L'Orial"
where = f"text='{brand}'"
brand_pk_id = self.getPrimaryKeyIfExistInTable('brand', where)

def getPrimaryKeyIfExistInTable(self, table, where, key='id'):
   try:
      sql = f"SELECT {key} FROM {table} WHERE {where}"
      self.cursor.execute(sql)
      result = self.cursor.fetchone()
      return result[key if self.bUseDictCursor else 0] if result else None
   except pymysql.MySQLError as e:
      logging.error(e)
   return None
我可以看到python会转义所有引号,这可能会导致问题,但无法找到如何正确处理它

如果我将其转过来并使用带下划线的查询作为通配符:

brand = "L_Orial"
sql = f"SELECT {key} FROM {table} WHERE text LIKE '{brand}'" 

它很好用,但这不是我想要的

如果我正确理解您的问题,您的问题如下:

您的查询必须准确阅读:

SELECT * from brand WHERE text='L\'Orial'
但是,当您使用python执行查询时,您当前得到的结果如下:

SELECT * from brand WHERE text='L'Orial'
如果这确实是问题所在,您应该能够通过简单地转义查询中需要的反斜杠来解决这个问题。查询的完整python字符串为:

Python字符串: 选择*品牌,其中text='L\\'O' 结果查询 选择*from brand WHERE text='L' 如果您希望自动修复所有可能包含“a”的品牌的此问题,只需在进行查询之前将“替换为\”。例如:

品牌=L'Orial 品牌=品牌。替换“,\ \” 新Python字符串: 月刊 SQL中的输出 L'
为了说明问题,我不得不启动我的本地实例

首先,一些准备工作

导入pymysql 表='ps_carrier' 键='id_carrier' mysql={ 字符集:utf8, 数据库:mystore, 主机:localhost, 密码:secret, 用户:贾斯汀 } 正如有人在评论中所建议的,以下是

sql=从%s中选择%s,其中%s 其中=name='UPS' 使用pymysql.connect**mysql作为连接: 连接光标为cur时: cur.executesql,键,表,其中 由于所有字符串参数(甚至表名)都被引用,因此按预期引发错误


如果您需要更详细的说明,您可能需要查看一些模块,如和。我没有使用过这些模块。

您不应该使用f字符串在查询中插入参数,否则您的应用程序将容易受到SQL注入的攻击。您可以尝试以下操作:sql=从%s中选择%s,其中%s self.cursor.executesql,key,table,where@May.D,我不认为参数用于列名或表名;这些仅用于值。@据我所知,参数应用于转义查询中的任何变量。@May.D然后我们同意不同意。@JustinEzequiel我在mysql连接器文档中找不到任何内容,但您可以看看pyscopg2的文档模块非常类似Ok。。这意味着这将解决“brand=L'Orial brand=brand.replace”的问题,\\``据我所知,应该是的。谢谢。。我们得到了完全相同的解决方案:-如果您的问题已经解决,请记住将您的问题作为答案,以便其他人也可以从信息中受益!你想在帮助你的答案旁边。
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>

...

  File "C:\Python38\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''ps_carrier' WHERE 'name=\\'UPS\\''' at line 1")