2013-02-16 15 views
10

Mam dziwny problem przy użyciu klienta Mysql2 w Ruby. Podczas próby wykonania:Błąd mysql2 Ruby podczas wykonywania instrukcji w krótkim odstępie czasu

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

Ruby powoduje błąd, że tabela, z której wybieram, nie istnieje. Jeśli jednak wypróbuję następujące:

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

Zapytanie działa bez żadnych problemów. Wygląda na to, że muszę dać serwerowi MySQL trochę czasu, aby załadować dane, zanim będę mógł je przesłać. Czy ktoś może wyjaśnić, dlaczego tak się dzieje i jak programowo przezwyciężyć to bez snu?

Aktualizacja

zainicjować klienta jak tak:

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

Sprawdziłem atrybut 'query_options' i asynchroniczny jest ustawiona na false. Próbowałem jawnie ustawiając async => false flag bezskutecznie.

Ten sam problem występuje, jeśli mogę użyć

Model.connection.execute(SQL HERE) 

Uwaga, to wszystko jest wykonywane od wewnątrz badanej jednostki szynach.

Dzięki

+1

Wygląda jak masz 'autocommit' prawidłowo ustawione (' TRUE), ale jakoś zepsuć za pomocą [async] (https://github.com/brianmario/mysql2#async) w [opcje] (https://github.com/brianmario/mysql2#cascading-config). Czy mógłbyś opublikować cały związany z połączeniem kod (zaczynając od 'Mysql2 :: Client.new'), lub sprawdzić, czy jawny zestaw' client.query ("CREATE ...",: async => false) 'pomaga? – mudasobwa

+0

Nie trzeba wstawiać żadnych czekania. Używamy MySQL szeroko i na pełnych obrotach. Nasz został zainstalowany przy użyciu standardowego repo, z ustawieniami standardowymi, jednak używamy Sequel ORM ze sterownikami mysql lub mysql2. –

+0

Zgadzam się, że to dziwne. Wygląda na to, że można po prostu złożyć oba zapytania w jedno wywołanie multistatement 'client.query'. – histocrat

Odpowiedz

0

Z jakiegoś powodu jedyną rzeczą, że skończyło się na pracy, a nie potrzebując sleep 1 pomiędzy nimi jest następująca:

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