使用python和mysqldb将csv数据发送到mysql表中

时间:2013-05-27 12:54:08

标签: python mysql csv mysql-python

我一直在使用这个python代码一段时间,并在尝试执行时遇到各种错误。

import csv
import MySQLdb
# open the connection to the MySQL server.
# using MySQLdb
mydb = MySQLdb.connect(host='myhostinfo',
user='me',
passwd='mypw',
db='thedatabase')
cursor = mydb.cursor()
# read the presidents.csv file using the python
# csv module http://docs.python.org/library/csv.html
csv_data = csv.reader(file('CHN-mod.csv'))
# execute the for clicle and insert the csv into the
# database.
for row in csv_data:

    cursor.execute('INSERT INTO INDICATORS(INDICATORNAME, \
            , INDICATORCODE)' \
            'VALUES(%s, %s)',  row)
#close the connection to the database.
cursor.close()
print "Import to MySQL is over"

我的代码在在线python验证器中验证,但我收到错误:

Traceback (most recent call last):
  File "importdata.py", line 23, in <module>
    'VALUES(%s, %s)' , row)
  File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 201, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaultterrorhandler
    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 ' INDICATORCODE)VALUES('Indicator Name', 'Indicator Code'>' at line 1")

1 个答案:

答案 0 :(得分:1)

In [1]: 'INSERT INTO INDICATORS(INDICATORNAME, \
            , INDICATORCODE)' \
            'VALUES(%s, %s)'
Out[1]: 'INSERT INTO INDICATORS(INDICATORNAME,             , INDICATORCODE)VALUES(%s, %s)'

INDICATORNAME之后有两个逗号。


改为使用多行字符串:

cursor.execute('''INSERT INTO INDICATORS (INDICATORNAME, INDICATORCODE)
                  VALUES (%s, %s)''', row)

阅读起来容易得多,可以避免遇到问题。 MySQLdb解析字符串(尽管有空格)就好了。


要将每行的部分插入三个不同的表,您可以执行以下操作:

insert_indicators = '''INSERT INTO INDICATORS (INDICATORNAME, INDICATORCODE)
                       VALUES (%s, %s)'''
insert_foo = 'INSERT INTO FOO (...) VALUES (%s)' % (','.join(['%s']*10))
insert_bar = 'INSERT INTO BAR (...) VALUES (%s)' % (','.join(['%s']*10))

for row in csv_data:
    cursor.execute(insert_indicators, row[:2])
    cursor.execute(insert_foo, row[2:12])
    cursor.execute(insert_bar, row[12:22])