10

我在 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' 属性并将 async 设置为 false。我尝试明确设置 async => false 标志无济于事。

如果我使用同样的问题

Model.connection.execute(SQL HERE)

注意,这都是在 Rails 单元测试中执行的。

谢谢

4

1 回答 1

0

出于某种原因,唯一最终可以工作并且不需要sleep 1中间的事情是:

@model = Model.new    
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS
@model.connection.reconnect!
于 2013-05-09T22:07:28.597 回答