Я пытаюсь выполнить запрос LOAD DATA LOCAL INFILE для загрузки некоторых CSV-данных в таблицу с помощью mysql2 gem (0.3.11) под rails 3.1.1:
class Foo < ActiveRecord::Base
def self.load_csv
query = "LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '\n' (title)"
ActiveRecord::Base.connection.execute(query)
end
end
(Это пример приложения для воспроизведения ошибки для этой проблемы на github). Оно продолжает работать на OS X (Lion) со следующей ошибкой:
Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '
' (title)
Local infile is enabled on the server:
mysql> show variables where variable_name like '%local%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
и на клиенте с помощью этой директивы в application.rb:
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::LOCAL_FILES
Тот же самый оператор LOAD работает нормально с клиента MySQL. Изменение метода подключения к БД с сокета на TCP/IP ничего не меняет. MySql установлен через homebrew и его версия
mysql Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1
Я НЕ получаю эту ошибку, выполняя тот же код под Linux. Он также работает, если я опускаю модификатор LOCAL, но это не вариант, так как файл на самом деле локальный в production, а сервер базы данных удаленный. Это не имеет ничего общего с правами доступа к файлам, как в этом вопросе.
Это сводит меня с ума, любые идеи будут очень признательны.