我正在尝试使用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
答案 0 :(得分:0)
根据MySQL execute method docs,第一个参数应该是SQL字符串。
您正在通过查询和元组传递元组。
所以只需改为:
file = csv.reader(file('20184329:2143.csv'))
sql_insert_table = """INSERT INTO STAGING(ADRESSE_1600 ,
ADRESSE_1601, ADRESSE_1602, ADRESSE_1603)
VALUES ('%s', '%d', '%d', '%s')"""
for row in file:
cursor.execute(sql_insert_table, params=row)
请注意,您可以按原样传递该行,因为csv.reader
会返回字符串列表。
答案 1 :(得分:0)
cursor.execute()
需要一个sql语句(作为字符串)和一个可选的值序列,所以它应该是:
# this will build a (statement, (values,....)) tuple
args = "INSERT INTO STAGING(ADRESSE_1600 ,
ADRESSE_1601, ADRESSE_1602, ADRESSE_1603)
VALUES ('%s', '%d', '%d', '%s')", (row[i],i)
# so you need positional arguments unpacking:
cursor.execute(*args)
或者您可以使用:
sql = "INSERT INTO STAGING(ADRESSE_1600 ,
ADRESSE_1601, ADRESSE_1602, ADRESSE_1603)
VALUES ('%s', '%d', '%d', '%s')"
cursor.execute(sql, (row[i],i))
答案 2 :(得分:0)
你在这里遇到两个问题,并且接近一个共同的安全漏洞。
您似乎正在尝试使用%
- 样式替换来创建插入语句。我这样说是因为你在SQL字符串中引用了你的参数。那是really, really bad idea:如果有人输入他们的地址,比如');DROP TABLE STAGING;--
,那么你最终会执行他们的SQL。相反,使用SQL样式的占位符。这些看起来好像只是文字,如VALUES (%s)
,而不是VALUES ('%s')
。
即使这些参数看起来像是被%重排,就像你使用了Python的%
运算符一样,但它们并非如此。将使用实际值代替它们。所以,不要引用它们。
但是,出现错误的原因是语句和要使用的参数是cursor.execute
的两个独立参数。你目前正在将它们作为一个2长元组的单个参数传递。
这是一个固定版本:
sql_insert_table = """INSERT INTO STAGING(ADRESSE_1600 ,
ADRESSE_1601, ADRESSE_1602, ADRESSE_1603)
VALUES (%s, %s, %s, %s)"""
file = csv.reader(file('20184329:2143.csv'))
for row in file:
cursor.execute(sql_insert_table, row)