2013-02-16 9 views
10

Ho uno strano problema utilizzando il client Mysql2 in Ruby. Durante il tentativo di eseguire quanto segue:Errore di Ruby mysql2 durante l'esecuzione di istruzioni in rapida successione

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

Ruby genera un errore che la tabella da cui sto selezionando non esiste. Tuttavia se provo il seguente:

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

La query funziona senza problemi. Sembra come se avessi bisogno di dare al server MySQL un po 'di tempo per caricare i dati prima che io possa interrogarli. Qualcuno può spiegare perché questo sta accadendo e come superare questo programmaticamente senza usare il sonno?

Aggiornamento

ho inizializzare il client come così:

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

ho controllato l'attributo 'query_options' e asincrona è impostata su false. Ho provato ad impostare esplicitamente async => false flag senza alcun risultato.

Lo stesso problema si verifica se uso

Model.connection.execute(SQL HERE) 

nota, questo è tutto eseguito da uno unit test rotaie.

Grazie

+1

Sembra che tu hai 'autocommit' impostato correttamente (' true'), ma pasticcia in qualche modo con [async] (https://github.com/brianmario/mysql2#async) in [opzioni] (https://github.com/brianmario/mysql2#cascading-config). Potresti postare tutto il codice relativo alla connessione (a partire da 'Mysql2 :: Client.new'), o controllare se l'insieme esplicito' client.query ("CREATE ...",: async => false) 'aiuta? – mudasobwa

+0

Non è necessario inserire alcuna attesa. Usiamo ampiamente MySQL e alla massima velocità. Il nostro è stato installato usando un repo standard, con le impostazioni standard, tuttavia usiamo il Sequel ORM con i driver mysql o mysql2. –

+0

Sono d'accordo che è strano. Sembra che tu possa semplicemente passare entrambe le query in una singola chiamata 'client.query 'a più stati. – histocrat

risposta

0

Per qualche motivo l'unica cosa che ha finito per lavorare e non aver bisogno del sleep 1 In mezzo c'è il seguente:

@model = Model.new  
Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS 
@model.connection.reconnect! 
Problemi correlati