2013-02-16 2 views
10

У меня странная проблема с использованием клиента Mysql2 в Ruby. При попытке выполнить следующее:Ошибка 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 некоторое время для загрузки данных, прежде чем я смогу запросить его. Может ли кто-нибудь объяснить, почему это происходит и как программно преодолеть это, не используя сон?

Update

Я инициализация клиента, как так:

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

Я проверил атрибут 'query_options' и асинхронный устанавливаются в ложь. Я попытался явно установить флаг async => false безрезультатно.

То же проблема возникает, если я использую

Model.connection.execute(SQL HERE) 

Примечание, это все выполняется внутри теста Rails блока.

Благодаря

+1

Похоже, вы 'autocommit' установлены правильно (' true'), но как-то со сбоем [async] (https://github.com/brianmario/mysql2#async) в [options] (https://github.com/brianmario/mysql2#cascading-config). Не могли бы вы либо опубликовать весь связанный с подключением код (начиная с 'Mysql2 :: Client.new'), либо проверить, установлен ли явный набор' client.query («CREATE ...»,: async => false) 'помогает? – mudasobwa

+0

Вам не нужно вставлять никаких ожиданий. Мы широко используем MySQL и на полной скорости. Ours был установлен с использованием стандартного репо со стандартными настройками, однако мы используем ORK Sequel с драйверами 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! 
Смежные вопросы