2016-04-25 4 views
0

Как мой сервер, так и клиент MySql работают с local-infile=1. Это позволяет формировать мой выполнять запросы, подобные этим:Doctrine DBAL и LOAD DATA LOCAL INFILE

LOAD DATA LOCAL INFILE /var/data/report.csv INTO TABLE MyTable FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 2 LINES (column1, column2, column3)';

Все хорошо, когда я вхожу в к серверу MySql из командной строки, а затем выполнить запрос.

Однако, когда я хочу, чтобы выполнить тот же запрос с моим приложением, которое использует Doctrine DBAL и db.driver: pdo_mysql в conntect к той же базе данных, я получаю эту ошибку:

Syntax error or access violation: 1148 The used command is not allowed with this MySQL version

Оказывается, что моя установка mysql-клиент и сервер (local-infile=1) не соблюдаются Doctrine DBAL. Соединение приложения не разрешает LOAD DATA LOCAL INFILE, пока клиент и хост db делают это. Почему это? Как я могу настроить подключение к db для возможности выполнить LOAD DATA LOCAL INFILE?

ответ

0

Похоже, что это распространенная проблема. Я предполагаю, что это связано с тем, что соединения с сервером mysql устанавливаются по-разному различными приложениями (независимо от того, что все они могут использовать один и тот же драйвер). В зависимости от конкретного сценария использования, решение было бы одно из следующих действий:

  1. Если это возможно, попробуйте использовать LOAD DATA INFILE (не LOCAL). Для этого необходимо выполнить следующие условия:

    • Лучше всего, если ваш сервер mysql установлен на том же компьютере, что и ваш клиент.
    • Если вы работаете в Linux, вы должны настроить Apparmour, чтобы позволить mysqld acceess указать местоположение в вашей файловой системе, где хранится файл источника данных (/etc/apparmor.d/usr.sbin.mysqld, а затем перезагрузить apparmor). Вам также необходимо предоставить привилегию FILE пользователю mysql.
  2. Если вы знаете, что LOAD DATA INFILE это не вариант, и вам нужно LOCAL, вы можете попробовать выполнения запроса в программе непосредственно через соединение, установленное непосредственно с PDO, смотрите здесь: https://stackoverflow.com/a/18459367. Помните также, что пользователь, которым вы управляете своим клиентом mysql, должен иметь доступ для чтения к файлу, который вы пытаетесь загрузить.

  3. Вы также можете попытаться установить соединение клиента через Doctrine DBAL с (к сожалению) не очень хорошо документированы опцию "\ PDO :: MYSQL_ATTR_LOCAL_INFILE" (смотрите здесь https://stackoverflow.com/a/24759583)

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