2015-09-07 49 views
0

Python API将作为特定产品属性的值返回u"'HOPPE'S No. 9'"。然后我期待将其插入到数据库,还使用Python(蟒蛇-MySQLdb的),用下面的查询:如何处理MySQL-Python中的撇号?

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仍然拒绝它。所以我 - 逃生撇号,然后插入成功发生。事情是,它包含转义字符(所以写的是'HOPPE'S第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 
+2

在SQL中,您通过加倍引用单引号,但为什么不使用参数? – thebjorn

+1

参数化仅用于值子句。注意我每个值都有一个'%s',并且在sql和值元组之间有一个逗号(这不是字符串插值!) – thebjorn

+0

@thebjorn好所以现在的问题是我是字符串格式的configData [“表“]和sqlFieldMappingString,当我不应该。问题是:我无法像下面那样对列名进行硬编码,因为它们将分别来自变量* configData [“table”] *和* sqlFieldMappingString *。 – Pyderman

回答

2

你不应该这样构造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) 
+0

谢谢,看看我上面的编辑,我尝试了一个你的建议的变种 - 仍然没有运气。我究竟做错了什么? – Pyderman

+0

是的字符串格式化运算符和参数化的组合让我难住。再次感谢。 – Pyderman