我试图在我的覆盆子pi上运行python脚本,以便将我从gps接收器接收的数据存储到sql表中。在我执行此脚本时,我在代码的这一部分出现错误:
sql = "INSERT INTO gps (n_lat, w_long, date_time) VALUES (%s, %s, %s)" % (north, west, t,)
print sql
cur.execute(sql)
print "Rows inserted: %s" % cur.rowcount
con.commit()
time.sleep(0.5)
错误:
Traceback (most recent call last):
File "gps.py", line 48, in <module>
cur.execute(sql)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, 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 ':01:16)' at line 1")
我真的不明白问题出在哪里,你有没有想过为什么会发生错误?
答案 0 :(得分:1)
您在引号中设置值的SQL语句中的错误:
VALUES ('%s', '%s', '%s')
答案 1 :(得分:1)
您没有转义输入值。对于数字,这是可选的,但日期时间可能不是数字。
但是,您应始终转义数据库的输入值。此处的关键字是预备语句。您不应使用pythons %
operater将输入参数解析为字符串,而应使用cursor.execute
的参数列表。
sql = "INSERT INTO gps (n_lat, w_long, date_time) VALUES (%s, %s, %s)"
print sql
cur.execute(sql, (north, west, t,))
print "Rows inserted: %s" % cur.rowcount
con.commit()
time.sleep(0.5)
现在函数execute
将确保所有特殊字符都被转义。例如。您的一个输入值可能包含单引号或类似名称。使用python的字符串解析,这将导致类似:
"INSERT INTO gps (n_lat, w_long, date_time) VALUES ('123', '123', '1234'321')"
在最好的情况下,这会导致数据库错误,在最坏的情况下,有人可能会使用自己的SQL语句操作数据库(所谓的 SQL注入)。