2014-02-27 40 views
0

我正在嘗試使用Python腳本將csv文件導入到MySQL數據庫中。 它似乎失敗了。Python:MySQLdb LOAD DATA INFILE默默失敗

這裏是我的代碼:

#!/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) 

在嘗試調試這種情況下,我傾銷「查詢()」方法中的光標對象到屏幕上。下面是輸出:

{ '_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':None, ' arrayize':1,'_info':'Records:500 Deleted:0 Skipped:0 Warnings:0','lastrowid':0L,'_last_executed':「LOAD DATA LOCAL INFILE'/ home/ariggi/722140-93805 -sqltest.csv'INTO TABLE agriculture.degreedays FIELDS TERMINATED BY',';「,'_warnings':0,'_rows':()}

如果我參加了「_last_executed」查詢,這是

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

,並通過MySQL控制檯能夠正常運行,並與行填充表運行它。但是當我執行這個腳本時,我的數據庫表仍然是空的。

我很難過,可以使用一些幫助。

回答

3

嘗試在代碼的末尾調用db.conn.commit()以使更改永久。 Python默認情況下不使用「autocommit」模式,因此,除非發出提交,否則DB模塊會將您的更改視爲未完成事務的一部分。

由於@AirThomas指出了一個評論它有助於我們一個「上下文管理器」 - 儘管我想說的正確提法

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

,因爲這會自動提交任何更改,除非控制代碼引發一個例外。

+0

這樣做。謝謝!現在我更加困惑,因爲它沒有提交聲明就提前工作。如果在沒有提交的情況下運行2個查詢,第二個查詢是否提交第一個查詢? –

+3

@Mike如果你使用'with conn作爲遊標:'模塊會給你一個在'with'代碼塊內部使用的遊標,並且當你退出該模塊時提交。 – Air

+0

很棒的建議!我希望你不要介意我把它加入我的答案中(自然而然地應該有信用)。 – holdenweb