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
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
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. –
Sono d'accordo che è strano. Sembra che tu possa semplicemente passare entrambe le query in una singola chiamata 'client.query 'a più stati. – histocrat