有以下代码,它是脚本的一部分,用于读取stdin和进程日志。你知道吗
jobId = loglist[19]
deliveryCount += 1
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + %s WHERE id = %s') % (deliveryCount,jobId)
dbcon.commit()
dbcon.close()
我可以运行以下命令:
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + 1 WHERE id=1')
dbcon.commit()
dbcon.close()
它会起作用的。不太确定发生了什么,而且我很难快速测试,因为我无法看到脚本运行,因为我的程序直接输入到脚本中。我必须作出改变,重新启动程序,饲料,发送电子邮件,然后检查数据库。有其他脚本,并且能够在SQL语句中毫无问题地使用变量。你知道吗
对可能发生的事情有什么建议吗?还有,关于如何更快地测试有什么建议吗?你知道吗
完整代码:
import os
import sys
import time
import MySQLdb
import csv
if __name__=="__main__":
dbcon = MySQLdb.connect(host="tattoine.mktrn.net", port=3306, user="adki", passwd="pKhL9vrMN8BsFrJ5", db="adki")
dbcur = dbcon.cursor()
#type, timeLogged,timeQueued,orig,rcpt,orcpt,dsnAction,dsnStatus,dsnDiag,dsnMta,bounceCat,srcType,srcMta,dlvType,dlvSourceIp,dlvDestinationIp,dlvEsmtpAvailable,dlvSize,vmta,jobId,envId,queue,vmtaPool
while True:
line = sys.stdin.readline()
fwrite = open("debug.log","w")
# fwrite.write(str(deliveryCount))
fwrite.write("test2")
dbcur.execute("INSERT INTO test(event_type) VALUES ('list')")
dbcon.commit()
loglist = line.split(',')
deliveryCount = 0
bounceType = loglist[0]
bounceCategory = loglist[10]
email = loglist[4]
jobId = loglist[19]
if bounceType == 'd':
deliveryCount += 1
fwrite = open("debug2.log","w")
# fwrite.write(str(deliveryCount))
fwrite.write("test3")
dbcur.execute("INSERT INTO test(event_type) VALUES (%d)", deliveryCount)
dbcon.commit()
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + %s WHERE id = %s',(deliveryCount,jobId))
dbcon.commit()
dbcon.close()
不要使用字符串插值来运行sql查询。你知道吗
你应该做:
execute函数有两个参数。带有占位符和参数元组的查询。这样,mysql将为您转义参数并防止sql注入攻击(http://en.wikipedia.org/wiki/SQL_injection)
您的错误一定是因为您对查询的结果使用了%运算符
'UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + %s WHERE id = %s'
。这个查询本身(没有参数)在语法上对于mysql是不正确的。必须将参数元组作为第二个参数传递给execute函数。你知道吗相关问题 更多 >
编程相关推荐