我有一个小问题。而且我认为我做的事情很愚蠢,但无法弄清楚
首先: 我想从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(NCLASS
,CRECEIVE
,SUBCAT
,GDATE
,ASSCODE
,PATENT
,COUNTRY
,{ {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(CAT
,NCLASS
,CRECEIVE
,SUBCAT
,GDATE
,ASSCODE
,PATENT
,{{1} },COUNTRY
)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)
它抛出了这个错误 - (1054,“字段列表'中的未知列'BE'”)
查询:'插入到XXX(GYEAR
,CAT
,NCLASS
,CRECEIVE
,SUBCAT
,GDATE
,ASSCODE
,{ {1}},PATENT
)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)'
COUNTRY
,GYEAR
,CAT
,NCLASS
,CRECEIVE
,SUBCAT
,GDATE
,ASSCODE
,PATENT
)价值观(269,1,69,1096,1,3070801,BE,1963,6) )
这显然不正确,因为它没有将字符串值括在引号内。我相信这可能会导致错误。为此,我现在在开发周期中停留了几个小时。请帮忙
提前致谢
答案 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)
查看格式正确的查询,因为它可以在您的数据库中执行。