Python、MySQL在使用变量时不插入。可以在适当的位置使用变量的精确值,并且可以正常工作
具有以下代码:Python、MySQL在使用变量时不插入。可以在适当的位置使用变量的精确值,并且可以正常工作,python,mysql,Python,Mysql,具有以下代码: import os import sys import time import MySQLdb if __name__=="__main__": dbcon = MySQLdb.connect(host="host", port=3306, user="db", passwd="passwd", db="adki") dbcur = dbcon.cursor() deliveryCount = 0 bounceBadMailbox = 0 bounceInactiveAcc
import os
import sys
import time
import MySQLdb
if __name__=="__main__":
dbcon = MySQLdb.connect(host="host", port=3306, user="db", passwd="passwd", db="adki")
dbcur = dbcon.cursor()
deliveryCount = 0
bounceBadMailbox = 0
bounceInactiveAccount = 0
bouncePolicyRelated = 0
bounceSpamRelated = 0
bounceQuotaIssues =0
while True:
#type, timeLogged,timeQueued,orig,rcpt,orcpt,dsnAction,dsnStatus,dsnDiag,dsnMta,bounceCat,srcType,srcMta,dlvType,dlvSourceIp,dlvDestinationIp,dlvEsmtpAvailable,dlvSize,vmta,jobId,envId,queue,vmtaPool
line = sys.stdin.readline()
logList = line.split(',')
bounceType = str(logList[0])
if bounceType != "type":
bounceType = str(logList[0])
bounceCategory = logList[10]
emailAddress = logList[4]
jobId = str(logList[23])
fwrite = open("debug.log","a")
fwrite.write(jobId)
if bounceType == "d":
deliveryCount += 1
fwrite = open("debug2.log","a")
fwrite.write(str(jobId))
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + 1 WHERE id = ' + jobId)
dbcon.commit()
fwrite = open("debug2.log","w")
fwrite.write("out of true loop")
dbcon.close()
python新手。这真让我难堪。上面的SQL语句不起作用(pmta_delivered的值仍然为0),但我可以运行:
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + 1 WHERE id = ' + '42')
而且它有效!?!。在'debug2.log'中,我写入了值'42'。发生什么事了
数据库架构:
--
-- Table structure for table `campaign_stat_delivered`
--
CREATE TABLE IF NOT EXISTS `campaign_stat_delivered` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`pmta_delivered` int(9) NOT NULL DEFAULT '0',
`async_bounces` int(9) NOT NULL DEFAULT '0',
`bad_mailbox` int(11) NOT NULL DEFAULT '0',
`inactive_account` int(11) NOT NULL DEFAULT '0',
`policy_related` int(11) NOT NULL DEFAULT '0',
`spam_related` int(11) NOT NULL DEFAULT '0',
`quota_issues` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
同样,我可以将sql更改为:
dbcur.execute('UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + 1 WHERE id = 1')
而且效果很好。真是目瞪口呆。假设您的jobId是显示整数值的字符串,我建议 添加断言,确保字符串长度非零 请确保字符串为整数格式
assert len(jobId) > 0
try:
int(jobId)
except ValueError:
print "ERROR: jobId is not in format of integer"
raise
这可能会告诉您,原因是什么。您可能需要使用
str(jobId)
。然而,这很难说,因为你没有解释它是如何不起作用的。你收到错误信息了吗?如果是这样,请在您的帖子中包含完整的错误消息。我想可能是str或int的问题(数据库是int)。它不起作用,因为它不给pmta_提供价值。(我已经尝试了str和int,但都不起作用。请注意在您的问题中提供正确缩进的代码。不确定您的意思吗?另外,仅供参考,我只是尝试了jobId='8',这也没有提供pmta_交付的值。?:\尝试了这个,没有错误。还尝试了只执行jobId='8',但它仍然不执行查询。真的不明白为什么不能这样做。)正在工作。告诉我们更多信息-在执行过程中是否有任何错误消息?具体是什么?提供您尝试更新的表的架构将显示,预期的类型是什么。数据库日志文件中有任何投诉?更新了问题以显示db架构。还提供了工作正常的SQL代码。没有错误。将查看db日志。是否有w当python尝试插入时,我可以用python记录响应吗?我真的尝试了我所能想到的一切组合!因此,将数据库更改为“varchar”,并执行jobid='4',我得到了一个插入..因此取得了进展,但就目前而言,从我的日志列表中获取实际的“jobid”不起作用。