Risposte:
Mi sono appena imbattuto anche in questo problema. Ho dovuto aggiungere LOCAL
alla mia istruzione SQL.
Ad esempio, questo dà il problema di autorizzazione:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}
Aggiungi LOCAL
alla tua dichiarazione e il problema delle autorizzazioni dovrebbe scomparire. Così:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
--local-infile
opzione.
Ho avuto questo problema. Ho cercato in giro e non ho trovato una risposta soddisfacente. Riassumo di seguito i risultati delle mie ricerche.
L'errore di accesso negato potrebbe significare che:
GRANT FILE on *.* to user@'localhost'
); o,Prova a usare questo comando:
load data local infile 'home/data.txt' into table customer;
Questo dovrebbe funzionare. Ha funzionato nel mio caso.
ERROR 1148 (42000): The used command is not allowed with this MySQL version
La stringa di Lione mi ha dato un ottimo consiglio: su Windows, dobbiamo usare slah e non backslash. Questo codice funziona per me:
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();
Mi sono imbattuto nello stesso problema e l'ho risolto seguendo questi passaggi:
Per questo terzo punto, puoi fare riferimento a: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv
BR,
ANNO DOMINI
È successo anche a me e nonostante abbia seguito tutti i passaggi descritti da Yamir nel suo post non sono riuscito a farlo funzionare.
Il file era in /tmp/test.csv con autorizzazioni 777. L'utente MySQL aveva i permessi sui file, l'opzione LOCALE non era consentita dalla mia versione di MySQL, quindi ero bloccato.
Finalmente sono riuscito a risolvere il problema eseguendo:
sudo chown mysql:mysql /tmp/test.csv
Ne ho trovato uno facile se stai usando la riga di comando
Accedi comemysql -u[username] -p[password] --local-infile
poi SET GLOBAL local_infile = 1;
seleziona il tuo database per use [db_name]
e infine 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;
non sembra funzionare in RDS, ma comunque senza che --local-infile
abbia funzionato
Ho scoperto che caricare le tabelle MySQL può essere veloce e indolore (stavo usando gli script di gestione modelli python / Django):
1) crea una tabella con tutte le colonne VARCHAR (n) NULL es:
mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);
2) rimuovi le intestazioni (prima riga) da csv, quindi carica (se dimentichi LOCAL, otterrai "# 1045 - Accesso negato per l'utente 'utente' @ 'localhost' (utilizzando la password: SI)"):
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) modifica colonne:
mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;
mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;
Ecco!
Probabilmente significa che la password che hai fornito 'user'@'localhost'
non è corretta.