0

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

首先:我想从 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 我没有其他方法,因为列名和值都将取决于外部条件。q还有一条信息是传递的value_tuple原来是一个列表。

这段代码中出现了两种情况,可惜这些方法都不起作用

条件 1:当 value_tuple = ('269', '1', '69', '1096', '1', '3070801', 'BE', '1963', '6') 且 stmt = INSERT INTO XXX ( NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) 值 (?, ?, ?, ?, ?, ?, ?, ?, ?) 我收到此错误 - 并非所有参数都在字符串格式化期间转换

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

条件 2:当 value_tuple = ('269', '1', '69', '1096', '1', '3070801', 'BE', '1963', '6') 并且 stmt = INSERT INTO XXX ( NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) 它抛出这个错误 - (1054, "Unknown '字段列表'中的列 'BE'") 查询:'INSERT INTO XXX ( NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'

似乎它根本没有取代。但是如果我在 cur.execute 之前进行打印 (stmt % v),则结果显示为 - INSERT INTO XXX ( NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (269, 1, 69, 1096, 1, 3070801, BE, 1963, 6)

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

提前致谢

4

1 回答 1

4

您想使用传递参数

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)

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

于 2012-11-20T07:44:14.223 回答