Відповіді:
Я також просто натрапив на це питання. Мені довелося додати LOCAL
до мого оператора SQL.
Наприклад, це дає проблему з дозволом:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}
Додайте LOCAL
до заяви і питання дозволів має усунутись. Так:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
--local-infile
параметра.
У мене була ця проблема. Я обшукував і не знайшов задовільної відповіді. Я підсумовую підсумки результатів своїх пошуків.
Помилка, відхилена в доступі, може означати:
GRANT FILE on *.* to user@'localhost'
); або,Спробуйте скористатися цією командою:
load data local infile 'home/data.txt' into table customer;
Це має спрацювати. Це спрацювало в моєму випадку.
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Рядок з Ліона дав мені дуже гарну пораду: У Windows нам потрібно використовувати риски, а не звороту косу рису. Цей код працює для мене:
File tempFile = File.createTempFile(tableName, ".csv");
FileUtils.copyInputStreamToFile(data, tempFile);
JdbcTemplate template = new JdbcTemplate(dataSource);
String path = tempFile.getAbsolutePath().replace('\\', '/');
int rows = template.update(MessageFormat
.format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
path, tableName));
logger.info("imported {} rows into {}", rows, tableName);
tempFile.delete();
Я зіткнувся з тим же питанням і вирішив його, виконавши наступні кроки:
Для цього 3-го пункту можна звернутися до: https://dev.mysql.com/doc/refman/5.7/uk/server-system-variables.html#sysvar_secure_file_priv
BR,
AD
Це сталося і зі мною, і, незважаючи на те, що я дотримувався всіх кроків, описаних Яміром у своєму пості, я не зміг змусити його працювати.
Файл знаходився у /tmp/test.csv із 777 дозволами. Користувач MySQL мав дозволи на файли, опція LOCAL заборонена моєю версією MySQL, тому я застряг.
Нарешті я зміг вирішити проблему, запустивши:
sudo chown mysql:mysql /tmp/test.csv
Я знайшов простий, якщо ви використовуєте командний рядок
Увійти якmysql -u[username] -p[password] --local-infile
тоді SET GLOBAL local_infile = 1;
виберіть свою базу даних за use [db_name]
і, нарешті LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;
SET GLOBAL local_infile = 1;
, схоже , це не працює в RDS, але все одно без цього --local-infile
зробив трюк
Я виявив, що завантаження таблиць MySQL може бути швидким і безболісним (я використовував сценарії менеджера моделі python / Django):
1) створити таблицю з усіма стовпцями VARCHAR (n) NULL, наприклад:
mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);
2) видаліть заголовки (перший рядок) із csv, а потім завантажте (якщо ви забудете LOCAL, ви отримаєте "# 1045 - доступ заборонено користувачеві" user "@" localhost "(використовуючи пароль: ТАК)"):
mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
-> ;
Query OK, 119426 rows affected, 19962 warnings (3.41 sec)
3) змінити стовпці:
mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;
mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;
voilà!
Це, ймовірно, означає, що пароль, який ви ввели, 'user'@'localhost'
є неправильним.