2013-02-16 3 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

+0

待機を挿入する必要はありません。我々は、MySQLを全面的に高速で使用しています。私たちは標準設定で標準レポを使用してインストールされましたが、Sequel ORMをmysqlまたはmysql2ドライバとともに使用しています。 –

+0

私はそれが奇妙であることに同意します。あなたは両方のクエリを単一のマルチステートメント 'client.query'呼び出しに折りたたむことができるようです。 – histocrat

答えて

0

が作業との間でsleep 1を必要としないことになった唯一のものは以下の通りです:

@model = Model.new  
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS 
@model.connection.reconnect! 
関連する問題