mysqldb.execute中的字符串替换问题

时间:2012-11-20 07:43:12

标签: python mysql-python

我有一个小问题。而且我认为我做的事情很愚蠢,但无法弄清楚

首先: 我想从python在mysql上激活动态构造的sql。它的简单插入语句,但值可以有双引号和其他特殊字符。所以,我不知道该怎么做。 然后我来到这个线程 - Stackoverflow

根据这个我试过以下代码

def fire_statement(stmt, value_tuple=None):

    try:
        if value_tuple == None:
            cur.execute(stmt)
            return True
        else:
            v = tuple(value_tuple)                
            cur.execute(stmt % v)
            return True
    except Exception, ex:
        print ex
        print "Query: '"+stmt+"'"
        return False

我必须在此函数中传递动态创建的stmt和value_tuple我没有别的办法,因为列名和值都取决于外部条件。 qand另一条信息是传递的value_tuple最初是一个列表。

此代码中出现两个条件,唉,这些方法都不起作用

condition-1:当value_tuple =('269','1','69','1096','1','3070801','BE','1963','6') 和stmt = INSERT INTO XXX(NCLASSCRECEIVESUBCATGDATEASSCODEPATENTCOUNTRY,{ {1}},GYEAR)VALUES(?,?,?,?,?,?,?,?,?) 我收到此错误 - 不是在字符串格式化期间转换的所有参数

(显然,对于这种情况,行 - cur.execute(stmt%v)更改为cur.execute(stmt,v))。

条件-2:当value_tuple =('269','1','69','1096','1','3070801','BE','1963','6')和stmt =插入到XXX(CATNCLASSCRECEIVESUBCATGDATEASSCODEPATENT,{{1} },COUNTRY)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s) 它抛出了这个错误 - (1054,“字段列表'中的未知列'BE'”) 查询:'插入到XXX(GYEARCATNCLASSCRECEIVESUBCATGDATEASSCODE,{ {1}},PATENT)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)'

似乎它根本没有取代。但如果我在cur.execute之前执行打印(stmt%v),则结果显示为 - INSERT INTO XXX(COUNTRYGYEARCATNCLASSCRECEIVESUBCATGDATEASSCODEPATENT)价值观(269,1,69,1096,1,3070801,BE,1963,6) )

这显然不正确,因为它没有将字符串值括在引号内。我相信这可能会导致错误。为此,我现在在开发周期中停留了几个小时。请帮忙

提前致谢

1 个答案:

答案 0 :(得分:3)

您想使用

传递参数
cur.execute(stmt, v)

而不是

cur.execute(stmt % v)

如果你有

"INSERT INTO tab (col1, col2) VALUES (%s, %s)"

并使用('val1', 'val2')传递两个字符串%,它将变为:

"INSERT INTO tab (col1, col2) VALUES (val1, val2)"

被解释为列名,显然不存在。

如果你这样做

cur.execute(stmt, v)

它将被正确解释为

"INSERT INTO tab (col1, col2) VALUES ('val1', 'val2')"

您也可以使用

print cur.mogrify(stmt, v)

查看格式正确的查询,因为它可以在您的数据库中执行。