使用python 2.7将csv文件加载到mysql中

时间:2018-03-31 04:33:55

标签: python mysql

我正在尝试使用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

3 个答案:

答案 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)

Her daughter is named Help I'm trapped in a driver's license factory.