我正在尝试发出一个LOAD DATA LOCAL INFILE查询,使用rails 3.1.1下的mysql2 gem(0.3.11)将一些CSV数据加载到表中:
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
(这是一个重现this github issue错误的示例应用)。这使得OS X(Lion)上的失败,并出现以下错误:
Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '
' (title)
服务器上启用了本地infile:
mysql> show variables where variable_name like '%local%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
在客户端上通过application.rb中的this指令:
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::LOCAL_FILES
相同的LOAD语句可以从MySQL客户端正常工作。将数据库连接方法从套接字更改为TCP / IP没有任何区别。 MySql是通过自制程序安装的,版本是
mysql Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1
我不会在Linux下运行相同的代码时出现此错误。如果省略LOCAL修饰符,它也可以工作,但这不是一个选项,因为该文件实际上是生产本地和数据库服务器远程。它与this问题中的文件权限无关。
这让我疯狂,任何见解都非常感激。
答案 0 :(得分:4)
问题应该修复为mysql2 v&gt; 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)
答案 1 :(得分:0)
事实证明,这可以通过重新安装mysql2 gem来解决。我想我已经安装了一个从源代码编译的MySQL版本,然后转换到通过brew安装的MySQL,这导致gem使用的客户端代码不兼容。这解释了为什么它在命令行客户端工作,但在使用gem时没有。
gem uninstall mysql2
gem install mysql2
...卫生署