Python MySQLdb错误 - 是啥导致了这个
Posted
技术标签:
【中文标题】Python MySQLdb错误 - 是啥导致了这个【英文标题】:Python MySQLdb error - what is causing thisPython MySQLdb错误 - 是什么导致了这个 【发布时间】:2012-07-25 03:31:38 【问题描述】:我想知道为什么会收到此错误:
cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"
c.execute(cmd)
db.commit()
INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)
Traceback (most recent call last):
File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 94, in <module>
moodParser()
File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 92, in moodParser
query()
File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 37, in query
main(columns)
File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 81, in main
c.execute(cmd)
File "C:\Python27\lib\site-packages\mysqldb\cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
我相信这与我将值传递给 SQL 命令的方式有关。
【问题讨论】:
您没有显示实际的异常。 【参考方案1】:您创建查询的代码没有尝试引用字符串值:
cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"
看看你打印的SQL语句:
INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)
不应该引用“类别”吗?
首先,您不应该使用字符串操作来编写 SQL 语句。这就是 SQL 注入漏洞发生的方式。相反,您应该使用占位符并让 MySQL 库处理它们:
c.execute(
"INSERT INTO resulttest (category, value, timestamp) VALUES (?, ?, ?)",
(key, value, timestamp)
)
【讨论】:
当我引用类别值时,一切正常。我不知道插入 SQL 时需要引用字符串。我会记住这一点,以备不时之需。我仍在努力在数据库设计/功能方面取得惊人的成绩(我的同事建议我阅读普通表格)【参考方案2】:如果 Ned Batchelder 的建议不起作用,这里有一个替代方案:
sql = "INSERT into resulttest (category, value, timestamp) VALUES (%s, %s, %s)"
c.execute(sql % (key, value, timestamp))
我遇到了一个问题,我的 SQL 命令没有被执行,并且遵循这种语法使其工作。
虽然你必须小心,因为使用%
而不是,
会打开SQL 注入的可能性,但这是唯一对我有用的语法。可能是 Python-MySQL 版本和兼容性问题。
更好的办法是安装兼容版本并遵循正确的语法。
【讨论】:
以上是关于Python MySQLdb错误 - 是啥导致了这个的主要内容,如果未能解决你的问题,请参考以下文章