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 に答える