【问题标题】:How to handle apostrophes in MySQL-Python?如何处理 MySQL-Python 中的撇号?
【发布时间】:2015-12-02 11:31:28
【问题描述】:

Python API 将u"'HOPPE'S No. 9'" 作为特定产品属性的值返回。然后我希望将其插入数据库,同样使用 Python (python-mysqldb),并使用以下查询:

INSERT INTO mytable (rating, Name) VALUES('5.0 (7)', 'HOPPE'S No. 9';

MySQL 拒绝这样做,建议在 MySQL 中处理单引号的方法是 escape it first。这是我需要在 Python 中完成的,所以我尝试:

In [5]: u"'HOPPE'S No. 9'".replace("'", "\'")
Out[5]: u"'HOPPE'S No. 9'"

当我将它合并到我的程序中时,MySQL 仍然拒绝它。所以我 double-转义撇号,然后插入成功。问题是,它包含转义字符(所以写的是 'HOPPE\'S No. 9')。

如果我需要第二个转义字符,但是当我添加它时,我如何处理转义而不在插入的字符串中包含转义字符?

编辑:根据 theBjorn 的建议,尝试:

actualSQL = "INSERT INTO %s (%s) VALUES(%s);"

#cur.execute(queryString)
cur.execute(actualSQL,
            (configData["table"], sqlFieldMappingString, sqlFieldValuesString))

但看起来我回到了我尝试使用 .replace() 的单一转义逃生时的位置:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''mytable' ('rating, Name, Image, mfg, price, URL') VALUES('\'5.0 (3)\', \'AR-1' at line 1

【问题讨论】:

  • 在 SQL 中,您通过将单引号加倍来引用单引号,但您为什么不使用参数?!
  • 参数化仅用于 values 子句。请注意,我每个值都有一个 %s,并且 sql 和值元组之间有一个逗号(这不是字符串插值!)
  • @thebjorn 好的,所以现在的问题是我正在对 configData["table"] 和 sqlFieldMappingString 进行字符串格式化,而我不应该这样做。问题是:我无法像您在下面所做的那样对表格的列名进行硬编码,因为它们将分别来自变量 configData["table"]sqlFieldMappingString
  • 将 [5]: u"'HOPPE'S No. 9'".replace("'", "\'") 更改为 In [5]: u"'HOPPE'S No. 9' ".replace("'", "\\'"),注意 \' 和 \\'

标签: python mysql python-2.7 escaping mysql-python


【解决方案1】:

你永远不应该那样构造 sql。改用参数化代码:

cursor.execute(
    "insert into mytable (rating, name) values (%s, %s);",
    ("5.0 (7)", "HOPPE'S No. 9")
)

您的最新问题是由于误认为这是字符串插值,但事实并非如此(%s 的使用令人困惑),因此:

actualSQL = "INSERT INTO %s (%s) VALUES(%s);"

会错的。可以构建您的 sql 字符串,但可能更容易分两步完成,因此我们不会绊倒看起来像字符串插值标记的 sql 参数标记。假设你有一个名为 field_values 的元组中的值:

params = ["%s"] * len(field_values)         # create a list with the correct number of parameter markers
sql = "insert into %s (%s) values (%s)" % ( # here we're using string interpolation, but not with the values
    configData["table"], 
    sqlFieldMappingString,
    ', '.join(params)
)

如果你 print sql 它应该看起来像我上面的例子。现在你可以执行它:

cursor.execute(sql, field_values)

【讨论】:

  • 谢谢,看到我上面的编辑,我尝试了你的建议的变体 - 仍然没有运气。我做错了什么?
  • 是的,字符串格式化操作符和参数化的组合让我很难过。再次感谢。
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
相关资源
最近更新 更多