我正在尝试使用python将csv文件插入mysql。我只是mysql的新程序员,所以我不知道是什么问题。这是我的密码:
file = csv.reader(file('20184329:2143.csv'))
for row in file:
sql_insert_table = ("""INSERT INTO STAGING(ADRESSE_1600 ,
ADRESSE_1601, ADRESSE_1602, ADRESSE_1603)
VALUES ('%s', '%d', '%d', '%s')""", row)
cursor.execute(sql_insert_table)
问题是:
Traceback (most recent call last):
File "python_loaddata.py", line 22, in <module>
cursor.execute(sql_insert_table)
File "/usr/lib/python2.7/site-packages/MySQLdb/cursors.py", line 161, in execute
self.errorhandler(self, TypeError, m)
File "/usr/lib/python2.7/site-packages/MySQLdb/connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
TypeError: must be string or read-only buffer, not tuple
cursor.execute()
需要一个sql语句(作为字符串)和一个可选的值序列,因此它应该是:或者您可以使用:
你这里有两个问题,接近一个共同的安全漏洞。你知道吗
看起来您正在尝试使用
%
样式的替换来创建insert语句。我这么说是因为您在SQL字符串中引用了您的参数。这是一个really, really bad idea:如果有人输入他们的地址,比如说,');DROP TABLE STAGING;
,那么你最终将执行他们的SQL。相反,请使用SQL样式的占位符。它们看起来就像是文字,比如VALUES (%s)
,而不是VALUES ('%s')
。你知道吗即使这些参数看起来像是要被%-替换,就像使用Python的
%
操作符一样,但它们不是。实际值将代替它们。所以,不要引用它们。你知道吗但是,错误的原因是要使用的语句和参数是
cursor.execute
的两个独立参数。您当前将它们作为一个2长元组的单个参数传入。你知道吗以下是固定版本:
根据MySQL execute method docs,第一个参数应该是SQL字符串。你知道吗
您正在传递一个元组,以及查询和元组。你知道吗
所以换成:
注意,您可以按原样传递行,因为
csv.reader
返回字符串列表。你知道吗相关问题 更多 >
编程相关推荐