2014-08-29 199 views
2

我使用Python的MySQL的连接器,我试图运行通过Python(Windows)中的下列SQL语句 - 这是一个.csv文件:的Python/MySQL的 - LOAD DATA LOCAL INFILE

sql1 = ('SET GLOBAL local_infile = "ON";') 
cursor.execute(sql1) 

sql2 = ('LOAD DATA LOCAL INFILE "' + path[1:-1] + '" INTO TABLE mytable COLUMNS TERMINATED BY "," LINES TERMINATED BY "\\r\\n" (COL0, COL1, COL2, COL3, COL4, COL5, COL6) SET COL7 = "'some_data'";') 
cursor.execute(sql2) 

但当我尝试执行我收到以下异常:

1148(42000):所使用的命令是不允许使用此版本的MySQL

如果我尝试执行LOAD DATA LOCAL INFILE在MySQL控制台上,一切运行良好。

+0

哪个命令是问题? sql1或sql2? – mgilson 2014-08-29 17:27:24

+0

sql2是问题 – heliosk 2014-08-29 17:38:59

回答

2

LOAD DATA INFILE默认情况下,用连接器/ Python的 禁用,同时创造设置LOCAL_FILES客户标志像连接这个:

from mysql.connector.constants import ClientFlag 
conn = mysql.connector.connect(...., client_flags=[ClientFlag.LOCAL_FILES]) 
+0

它确实有效。我尝试过一次,但我忘了添加导入。 – heliosk 2014-09-01 11:01:45

0

LOAD DATA有很多安全问题,所以服务器真的很挑剔。您是否登录到本地主机,而不是服务器的公共IP?通常一个IP将被授予LOAD DATA,但另一个不会。

the fine manual

0

你可以通过文件的每一行迭代,将每一个行。这很容易,因为你已经提到每列都是由,划定的,每一行都是由换行符划定的。

例如,假设你的表mytable中有8个字符串列,(COL0到COL7):

input_file = open(path[1:-1], 'r') 

#Loop through the lines of the input file, inserting each as a row in mytable 
for line_of_input_file in input_file: 
    values_from_file = line_of_input_file.split(',', 1) #get the columns from the line read from the file 

    if(len(values_from_file) == 7): #ensure that 7 columns accounted for on this line of the file 
     sql_insert_row = "INSERT INTO mytable VALUES (" + values_from_file[0] + "," + values_from_file[1] + "," + values_from_file[2] + "," + values_from_file[3] + "," + values_from_file[4] + "," + values_from_file[5] + "," + values_from_file[6] + "," + some_data + ");" 
     cursor.execute(sql_insert_row) 
input_file.close() 
+0

执行'INSERT'需要很长时间。我必须插入数千个寄存器。这就是我选择LOAD DATA的原因。 – heliosk 2014-09-01 11:03:54