2013-02-13 69 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,元组执行过的文件名。

适合我。