2014-05-20 73 views
0

編寫一個腳本來爲MySQL導入轉換原始數據我使用了一個臨時文本文件,我稍後使用LOAD DATA INFILE ...命令手動導入。快速MySQL導入

現在我包括導入命令進入python腳本:

db = mysql.connector.connect(user='root', password='root', 
          host='localhost', 
          database='myDB') 
    cursor = db.cursor() 
    query = """ 
    LOAD DATA INFILE 'temp.txt' INTO TABLE myDB.values 
    FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'; 
    """ 
    cursor.execute(query) 
    cursor.close() 
    db.commit() 
    db.close() 

這工作,但TEMP.TXT必須是在不適合我的需要的數據庫目錄。

下一頁計算策略傾銷文件,並直接commiting:

db = mysql.connector.connect(user='root', password='root', 
          host='localhost', 
          database='myDB') 
    sql = "INSERT INTO values(`timestamp`,`id`,`value`,`status`) VALUES(%s,%s,%s,%s)" 
    cursor=db.cursor() 

    for line in lines: 
     mode, year, julian, time, *values = line.split(",") 
     del values[5] 
     date = datetime.strptime(year+julian, "%Y%j").strftime("%Y-%m-%d") 
     time = datetime.strptime(time.rjust(4, "0"), "%H%M").strftime("%H:%M:%S") 
     timestamp = "%s %s" % (date, time) 
     for i, value in enumerate(values[:20], 1): 
      args = (timestamp,str(i+28),value, mode) 
      cursor.execute(sql,args) 
    db.commit() 

作品很好,但需要大約四倍長,這實在是太多了。 (在第一個版本中使用相同的結構來生成temp.txt)

我的結論是我需要一個文件,並且LOAD DATA INFILE命令更快。要放置文本文件的位置,LOCAL選項似乎很有用。但與MySQL連接器(1.1.7)有已知的錯誤: mysql.connector.errors.ProgrammingError:1148(42000):使用的命令是不允許與此MySQL版本

到目前爲止,我已經看到使用MySQLdb而不是MySQL Connector可能是一種解決方法。 MySQLdb上的活動似乎很低,而且Python 3.3的支持可能永遠不會到來。

是LOAD DATA LOCAL INFILE要走的路,如果有的話,是否有可用於python 3.3的工作連接器?

編輯:開發後數據庫將運行在服務器上,客戶端上的腳本。

回答

2

我可能錯過了一些重要的東西,但是不能只在第一塊代碼中指定完整的文件名?

LOAD DATA INFILE '/full/path/to/temp.txt' 

注意路徑必須是服務器上的路徑。

+0

這適用於當前的設置與本地數據庫中的每個訪問的文件使用LOAD DATA INFILE。數據庫很快就會遷移到服務器上(忘記提及這一點)。我猜,本地文件會更容易。 –

+0

如果您可以將文件上傳到服務器,然後在服務器上運行python,那將是最快的。我想用LOCAL是最好的,但我不能評論python連接器 –

0

要與你必須設置 LOCAL_FILES客戶標誌在創建連接

import mysql.connector 
from mysql.connector.constants import ClientFlag 
db = mysql.connector.connect(client_flags=[ClientFlag.LOCAL_FILES], <other arguments>)