ЗАГРУЗКА ДАННЫХ ЛОКАЛЬНЫЙ ИНФИЛЬ вызывает ошибку неправильно сформированного пакета с самоцветом mysql2 - PullRequest
5 голосов
/ 09 января 2012

Я пытаюсь выполнить запрос LOAD DATA LOCAL INFILE, чтобы загрузить некоторые данные CSV в таблицу, используя gem mysql2 (0.3.11) под рельсами 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)

Локальный файл включен на сервере:

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, но это не вариант, поскольку файл фактически локальный в производственном процессе, а сервер базы данных удален.Это не имеет ничего общего с правами доступа к файлам, как в этом вопросе.

Это сводит меня с ума, любые идеи очень приветствуются.

Ответы [ 2 ]

4 голосов
/ 23 августа 2012

Проблема должна быть исправлена ​​для mysql2 v> 0.3.12b4

У меня не получилось использовать флаг LOCAL_FILE, но добавив :local_infile => true к опциям, добился цели

1.9.3p194 :011 > a = Mysql2::Client.new(:username=>'root', :host=>'localhost', :password=>'', :database=>'bhl_indexer', :local_infile => true)

https://github.com/brianmario/mysql2/issues/293

0 голосов
/ 10 января 2012

Оказывается, это просто решается переустановкой самоцвета mysql2. Я думаю, что я установил его с версией MySQL, скомпилированной из исходного кода, а затем переключился на MySQL, установленный через brew, что привело к несовместимости в клиентском коде, используемом гемом. Это объясняет, почему он работал из клиента командной строки, но не при использовании gem.

gem uninstall mysql2
gem install mysql2

Doh ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...