2013-02-13 25 views
0

我想要一個腳本來遍歷文件夾中的csv文件並將它們轉儲到MySQL數據庫中。我能夠將一個csv文件轉儲到它中。但是有麻煩將文件名傳遞給SQL腳本。嵌入在python腳本中的SQL查詢 - 錯誤

這是我的代碼使用

file_path="C:\csv-files" 
files=os.listdir(file_path) 
files.sort() 
for n in files: 

    cursor.execute(" LOAD DATA LOCAL INFILE '%s' INTO TABLE new_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' Lines terminated by '\n' IGNORE 1 LINES ",(n)) 

而且我得到以下錯誤

raise errorclass, errorvalue 
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 'file1.csv'' INTO TABLE new_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY' at line 1") 

如果我使用的文件名,而不是直接傳遞給它的,它工作正常。

如果在拋出的錯誤中可以看到,SQL腳本中似乎有錯誤。

這將是整個代碼

import csv 
import MySQLdb 
import sys 
import os 
connection = MySQLdb.connect(host='localhost', 
    user='root', 
    passwd='password', 
    db='some_db') 


cursor = connection.cursor() 

file_path="C:\csv-files" 
files=os.listdir(file_path) 
files.sort() 
for n in files: 
    print n 



    cursor.execute(" LOAD DATA LOCAL INFILE %s INTO TABLE new_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' Lines terminated by '\n' IGNORE 1 LINES " %n) 



connection.commit() 
cursor.close() 

回答

0

首先,替換 '%s' 與%s查詢。 MySQLdb自動處理任何引用。

下面是一些更正和修改代碼:

import MySQLdb 
import os 

CSV_DIR = "C:\csv-files" 

connection = MySQLdb.connect(host='localhost', 
          user='root', 
          passwd='password', 
          db='some_db', 
          local_infile=1) 

cursor = connection.cursor() 

try: 
    for filename in sorted(os.listdir(CSV_DIR)): 
     cursor.execute("""LOAD DATA LOCAL INFILE %s 
          INTO TABLE new_table 
          FIELDS 
          TERMINATED BY ',' 
          OPTIONALLY ENCLOSED BY '"' 
          ESCAPED BY '"' 
          LINES TERMINATED BY '\n' 
          IGNORE 1 LINES""", 
         (os.path.join(CSV_DIR, filename),)) 

    connection.commit() 
finally: 
    cursor.close() 

注:我在MySQLdb.connect設置local_infile參數爲1,元組執行過的文件名。

適合我。