Python MySQL语句返回E

2024-05-23 14:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我对这一切都很陌生,所以请原谅我的愚蠢:)

import os
import MySQLdb
import time

db = MySQLdb.connect(host="localhost", user="root", passwd="********", db="workspace")
cursor = db.cursor()

tailoutputfile = os.popen('tail -f syslog.log')
while 1:
        x = tailoutputfile.readline()  
        if len(x)==0:
                break
        y = x.split()
        if y[2] == 'BAD':
                timestring = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
                cursor.execute("INSERT INTO releases (date, cat, name) values (timestring, y[4], y[7]")
        if y[2] == 'GOOD':
                print y[4] + '\t' + y[7]

所以我运行程序,这是我收到的错误消息

user@machine:~/$ python reader.py
Traceback (most recent call last):
  File "reader.py", line 17, in ?
    cursor.execute("INSERT INTO releases (date, cat, name) values (timestring, y[4], y[7]")
  File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 163, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to                                                              your MySQL server version for the right syntax to use near '[4], y[7]' at line 1")
user@machine:~/$

所以我假设错误显然来自于SQL语句

cursor.execute("INSERT INTO releases (date, cat, name) values (timestring, y[4], y[7]")

这里有一个y[4]和y[7]的例子。

YES      Mail.Sent.To.User:user@work.com.11.2.2008:23.17

发生此错误是因为我应该在尝试将这些值插入数据库之前对其进行转义吗? 或者我完全没有抓住重点??

任何帮助都将不胜感激! 提前谢谢。


Tags: inpyimportexecutedbiftimeline
3条回答
 cursor.execute("INSERT INTO releases (date, cat, name) values (timestring, y[4], y[7]")

应该是

 cursor.execute("INSERT INTO releases (date, cat, name) values (timestring, '%s', '%s')" % (y[4], y[7]))

调试此类内容的最佳方法是将查询放入一个变量中并使用该变量:

query = "INSERT INTO releases (date, cat, name) values (timestring, '%s', '%s')" % (y[4], y[7])
print query
cursor.execute(query)

打印出来的声明会让问题变得非常明显。

如果你要像这样使用列表变量,它可能会变得非常混乱,考虑只使用一次列表并将变量放入字典中。打字的时间要长一点,但记录下发生的事情要容易得多。

不要将“直接字符串连接”用于SQL,因为它不安全,更正确的变量是:

cursor.execute('INSERT INTO releases (date, cat, name) VALUES (%s, %s, %s)', (timestring, y[4], y[7]))

它自动转义值中的禁止符号(如“,”等)

如前所述,您无法将Python变量值复制到查询中,只复制它们的名称,这对MySQL没有任何意义。

但是,直接字符串连接选项:

cursor.execute("INSERT INTO releases (date, cat, name) VALUES ('%s', '%s', '%s')" % (timestring, y[4], y[7]))

是危险的,不应该使用。如果这些字符串有超出范围的字符,如'or\in,则有一个SQL注入导致可能的安全性损害。也许在你的应用程序中永远不会发生,但这仍然是一个非常糟糕的做法,初学者的SQL教程真的需要停止使用。

使用MySQLdb的解决方案是让DBAPI层替您将参数值插入和转义到SQL中,而不是自己尝试%it:

cursor.execute('INSERT INTO releases (date, cat, name) VALUES (%s, %s, %s)', (timestring, y[4], y[7]))

相关问题 更多 >