2012-05-03 9 views
7

È possibile effettuare molti aggiornamenti in una singola chiamata utilizzando Sequel?È possibile aggiornare in batch in Sequel?

Ad esempio, l'esecuzione di circa 200 aggiornamenti potrebbe richiedere diversi minuti sul mio server, ma se si forgia una singola query SQL viene eseguita in pochi secondi. Mi chiedo se Sequel potrebbe essere usato per forgiare quella query SQL o, ancora meglio, fare l'intera operazione, uno sparo da solo.

+1

Sì, ma dipende da che cosa esattamente si sta cercando di fare, e che cosa RDBMS siete in esecuzione su. Si prega di fornire maggiori informazioni in modo che possiamo consigliarvi meglio. –

+0

Sto usando PostgreSQL e voglio che Sequel pubblichi una singola query per più aggiornamenti, dato che sono in grado di fare in SQL semplice. – RooSoft

risposta

3

La soluzione che ho incontrato riguarda il metodo update_sql. Invece di eseguire l'operazione stessa, genera query SQL raw. Per eseguire il batch di più aggiornamenti, basta unirli a questi; in mezzo, chiama il metodo run con la stringa risultante e sei pronto.

La soluzione di batch è MODO più veloce di più aggiornamenti.

+1

Questa soluzione è solo più veloce di "più aggiornamenti" in quanto si sta effettuando una sola connessione/viaggio effettivo al database per l'intero set di aggiornamenti, invece di un-per. Si prega di notare che alcuni framework eseguono questo tipo di comportamento automaticamente - terranno gli aggiornamenti in memoria fino a quando la transazione non viene confermata. Inoltre, è possibile ricevere benefici ancora maggiori se più istruzioni possono essere riscritte su una istruzione _one_. –

+2

Potrebbe funzionare nel tuo caso, ma non tutti gli adattatori Sequel supportano più query in # Database run. In realtà Sequel non fornisce un metodo indipendente dall'adattatore che accetta più query in una singola stringa (alcuni adattatori funzioneranno con tale stringa, altri no). –

+1

Per il driver mysql2, è necessario utilizzare {flags: :: Mysql2 :: Client :: MULTI_STATEMENTS} come opzione al momento della connessione – tothemario

5

È possibile utilizzare Datset#importhttp://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-import "Inserisce più record nella tabella associata. Questo metodo può essere utilizzato per inserire in modo efficiente un gran numero di record in una tabella in una singola query se il database supporta. Gli inserti sono avvolte automaticamente una transazione. "

Ecco un esempio di come usarlo:

DB = Sequel.connect(...) 
DB[:movies].import([:id, :director, :title, :year], [[1, "Orson Welles", "Citizen Kane", 1941],[2, "Robert Wiene", "Cabinet of Dr. Caligari, The", 1920]])