Python,当我输入变量的实际值时,MySQL 语句有效,但在使用变量时却无效?

标签 python mysql 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 查询。

你应该这样做:

dbcur.execute(
    'UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + %s WHERE id = %s',
    (deliveryCount,jobId)
)

执行函数有两个参数。带有占位符和参数元组的查询。这样,mysql会为你转义你的参数,防止sql注入(inject)攻击(http://en.wikipedia.org/wiki/SQL_injection)

您的错误一定是由于您对查询结果使用了 % 运算符 'UPDATE campaign_stat_delivered SET pmta_delivered = pmta_delivered + %s WHERE id = %s'。这个查询本身(没有参数)对于 mysql 在语法上是不正确的。您必须将参数元组作为第二个参数传递给执行函数。

关于Python,当我输入变量的实际值时,MySQL 语句有效,但在使用变量时却无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23618280/

相关文章:

python - 在 Pandas 的两列中按名称拆分和附加

mysql - 简单 : What makes this query inefficent?

mysql - 如何退出 MySQL 安全模式?

node.js:如何检测空的标准输入流?

Perl 与 Sublime Text 2 : <STDIN> not working

c - 从txt文件中取出表并将其存储到c中的数组中

python - 无法使用 django + nginx 上传媒体文件

python - 计算使用 Pandas 的独特天数?

Python OpenCV : Getting Stats out of Hough Circle Detection

mysql - 将 REPLACE 与 CHAR(160) 一起使用将返回十六进制作为值