2013-02-16 75 views
10

在Ruby中使用Mysql2客户端时出现了一个奇怪的问题。当试图执行以下操作时:快速连续执行语句时出现Ruby mysql2错误

client.query("CREATE DATABASE ...; INSERT INTO ..."); #SQL truncated for brevity 
client.query("SELECT 1 FROM ...") #SQL truncated for brevity 

Ruby抛出一个错误,表示我选择的表不存在。但是,如果我尝试以下操作:

client.query("CREATE DATABASE ...; INSERT INTO ..."); #SQL truncated for brevity 
sleep 1 
client.query("SELECT 1 FROM ...") #SQL truncated for brevity 

该查询没有问题。似乎我需要给MySQL服务器一些时间才能加载数据,然后才能查询它。任何人都可以解释为什么会发生这种情况,以及如何以编程方式克服这一点,而不使用睡眠?

更新

我初始化客户端像这样:

Mysql2::Client.new({ 
         :adapter => "mysql2", 
         :host => ip_address, 
         :username => db_username, 
         :password => db_password, 
         :flags => Mysql2::Client::MULTI_STATEMENTS 
        }) 

我查了 'query_options' 属性和异步设置为false。我已经尝试明确设置async => false标志无济于事。

同样的问题发生,如果我用

Model.connection.execute(SQL HERE) 

注意,这是所有从Rails的单元测试中执行。

感谢

+1

它看起来像你'autocommit'正确设置(TRUE; ),但在[options](https://github.com/brianmario/mysql2#cascading-config)中[async](https://github.com/brianmario/mysql2#async)以某种方式混乱。你可以发布所有与连接有关的代码(以'Mysql2 :: Client.new'开始),还是检查显式集合'client.query(“CREATE ...”,:async => false)'是否有帮助? – mudasobwa 2013-02-17 00:30:14

+0

您不需要插入任何等待。我们广泛使用MySQL,并且全速运转。我们使用标准回购安装了标准设置,但是我们使用Sequel ORM与mysql或mysql2驱动程序。 – 2013-02-17 06:10:55

+0

我同意这很奇怪。它看起来像你可以将这两个查询合并为一个多语句“client.query”调用。 – histocrat 2013-03-05 22:10:50

回答

0

出于某种原因,结束了工作,而不是在需要的sleep 1的唯一的事情是:

@model = Model.new  
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS 
@model.connection.reconnect!