Python:MySQLdb LOAD DATA INFILE无声地失败

时间:2014-02-27 22:35:21

标签: python mysql mysql-python load-data-infile

我正在尝试使用Python脚本将csv文件导入MySQL数据库。 它似乎无声地失败。

这是我的代码:

#!/usr/bin/python

import MySQLdb

class DB:
    host = 'localhost'
    user = 'root'
    password = '**************'
    sqldb = 'agriculture'
    conn = None

    def connect(self):
        self.conn =  MySQLdb.connect(self.host,self.user,self.password,self.sqldb )

    def query(self, sql, params=None):
        try:
            cursor = self.conn.cursor()
            if params is not None:
                cursor.execute(sql, params)
            else:
                cursor.execute(sql)
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            cursor = self.conn.cursor()
            if params is not None:
                cursor.execute(sql, params)
            else:
                cursor.execute(sql)

        print vars(cursor)
        return cursor

    def load_data_infile(self, f, table, options=""):
        sql="""LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',';""" % (f,table)
        self.query(sql)


db = DB()

pathToFile = "/home/ariggi/722140-93805-sqltest.csv"
table_name = "agriculture.degreedays"

db.load_data_infile(pathToFile, table_name)

在尝试调试这种情况时,我将光标对象转储到“query()”方法中的屏幕上。这是输出:

  

{'_ result':无,'描述':无,'rownumber':0,'消息':[],   '_executed':“LOAD DATA LOCAL INFILE   '/home/ariggi/722140-93805-sqltest.csv'INTO TABLE degreedays FIELDS   TERMINATED BY',';','errorhandler':>,'rowcount':500L,'connection':,'description_flags':无,   'arraysize':1,'_ info':'记录:500删除:0跳过:0   警告:0','lastrowid':0L,'_last_executed':“LOAD DATA LOCAL   INFILE'/home/ariggi/722140-93805-sqltest.csv'INTO TABLE agriculture.degreedays   FIELDS终止于',';','_ warnings':0,'_'':()}

如果我采用“_last_executed”查询,即

LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE agriculture.degreedays FIELDS TERMINATED BY ',';

并通过mysql控制台运行它按预期工作并用行填充表。但是,当我执行此脚本时,我的数据库表仍为空。

我很难过,可以使用一些帮助。

1 个答案:

答案 0 :(得分:3)

尝试在代码末尾调用db.conn.commit()以使更改成为永久更改。默认情况下,Python不使用“自动提交”模式,因此在您发出提交之前,数据库模块会将您的更改视为未完成事务的一部分。

正如@AirThomas在评论中指出的那样,它对我们有一个“情境管理者” - 尽管我说正确的表述是

with conn.cursor() as curs:
    do_something_with(curs)

因为除非受控代码引发异常,否则它会自动提交任何更改。