mysql symfony doctrine2 load-data-infile

mysql - Se produjo una excepción al ejecutar ''LOAD DATA LOCAL INFILE



symfony doctrine2 (4)

Tengo todos los privilegios para el usuario de mysql para la base de datos pero sigo recibiendo el error a continuación

[Doctrine / DBAL / DBALException]
Se produjo una excepción al ejecutar ''LOAD DATA LOCAL INFILE'' /tmp/uk_insiders/tfo.uktrades_transaction_code.out ''IGNORE INTO TABLE uktrades_transaction_codes FIELDS TERMINATED BY'' | '' (id, descripción) '':

Advertencia: PDOStatement :: execute (): LOAD DATA LOCAL INFILE está prohibido en /Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php línea 138

[Symfony / Component / Debug / Exception / ContextErrorException]
Advertencia: PDOStatement :: execute (): LOAD DATA LOCAL INFILE está prohibido en /Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php línea 138


Tengo el mismo mensaje de excepción. Pude realizar esto usando DOP de forma precisa.


Intenté pasar el parámetro PDO :: MYSQL_ATTR_LOCAL_INFILE a través del parámetro de opciones de configuración de doctrina, pero no funcionó. Esta es la solución que finalmente me funciona.

$dbhost = $this->getContainer()->getParameter(''database_host''); $dbuser = $this->getContainer()->getParameter(''database_user''); $dbpass = $this->getContainer()->getParameter(''database_password''); $connParams = $em->getConnection()->getParams(); $pdoConn = new /PDO(''mysql:host='' . $dbhost . '';dbname='' . $connParams[''dbname''], $dbuser, $dbpass, array( /PDO::MYSQL_ATTR_LOCAL_INFILE => true )); $sql = "SET FOREIGN_KEY_CHECKS=0"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); $sql = "LOAD DATA LOCAL INFILE ''$file'' IGNORE INTO TABLE $tablename FIELDS TERMINATED BY ''|'' $columns"; $stmt = $pdoConn->prepare($sql); $stmt->execute();


Tengo el mismo problema ... Lo resuelvo por reemplazo:

LOAD DATA LOCAL INFILE ...

por

LOAD DATA INFILE

Opción local: cuando se especifica este cambio, el archivo de entrada se leerá desde el servidor en el que se ejecuta el cliente MySQL en lugar del servidor MySQL. Cuando este interruptor no se especifica, el archivo de entrada se leerá desde el directorio de datos en el host MySQL. Para usar LOAD DATA sin el interruptor LOCAL, el usuario conectado debe tener el privilegio "FILE". ( Http://geekology.co.za/article/2010/02/how-to-import-or-export-csv-or -text-files-to-from-mysql-databases )


Las dos respuestas de trabajo son soluciones:

  • La respuesta aceptada propone usar una conexión PDO
  • Otra respuesta propone eliminar la palabra clave LOCAL, pero no siempre es posible

Una tercera solución limpia es habilitar la opción LOCAL en Doctrine, pero es un poco complicado:

https://.com/a/24759583/425204

Nota: esto también requiere que LOCAL esté habilitado en la configuración de MySQL en el servidor: my.cnf