2014-08-29 4 views
2

Я использую разъем MySQL для Python, и я пытаюсь запустить следующую инструкцию SQL с помощью Python (Windows) - Это .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

+0

sql2 является проблемой – heliosk

ответ

2

нагрузки входной_файл данных по умолчанию отключена с Connector/Python во время создания соединения установки LOCAL_FILES клиента флаг как это:

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

Это действительно работало. Я попробовал это один раз, но я забыл добавить импорт. – heliosk

0

Существует множество проблем с безопасностью с LOAD DATA, поэтому сервер действительно придирчив. Вы входите в локальный хост, а не публичный IP-адрес сервера? Часто один IP-адрес будет предоставлен LOAD DATA, а другой - нет.

См the fine manual

0

Вы перебрать каждую строку файла, вставив каждый в виде строки. Это было бы легко, так как вы уже упоминали, что каждый столбец очерчен ,, и каждая строка оканчивается символами новой строки.

Например, предположим, ваша таблица туЬаЫе было 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

Смежные вопросы