使用python2.7将csv文件加载到mysql中

2024-09-28 03:22:42 发布

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

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

Tags: csvinpyexecutesqlusrlinemysql
3条回答

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

你这里有两个问题,接近一个共同的安全漏洞。你知道吗

看起来您正在尝试使用%样式的替换来创建insert语句。我这么说是因为您在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.

根据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返回字符串列表。你知道吗

相关问题 更多 >

    热门问题