Mysql
 sql >> Database >  >> RDS >> Mysql

Inserimento in blocco di tabelle relative a MySQL da bash

Ci sono vari requisiti contrastanti espressi nella tua domanda. Questa risposta si concentra sull'aspetto "mantieni il blocco".

Per mantenere un blocco della tabella per l'intera operazione, dovrai mantenere una singola connessione al server sql. Un modo sarebbe passare tutto come input multi-comando su più righe a una singola chiamata del client della riga di comando mysql. Fondamentalmente così:

{ echo "LOCK TABLES Table1 WRITE"
  for i in "${infiles[@]}"; do
    echo "LOAD DATA LOCAL INFILE '${i}'"
  done
} | mysql

Ciò funzionerebbe purché tu possa generare tutte le istruzioni richieste senza porre domande dal database (come l'identificatore massimo) mentre il blocco è mantenuto.

Per combinare operazioni di lettura (come la richiesta di un valore massimo) e operazioni di scrittura (come il caricamento del contenuto di alcuni file), avrai bisogno di una comunicazione bidirezionale con il server. Raggiungere questo obiettivo tramite bash è molto complicato, quindi lo sconsiglio. Anche se non è necessario fare domande, la connessione unidirezionale fornita da una pipe bash è fonte di pericolo:se qualcosa va storto sul lato mysql, bash non se ne accorgerà ed emetterà comunque il comando successivo. Potresti finire per commettere dati incoerenti.

Per questi motivi, preferirei suggerire alcuni linguaggi di scripting per i quali sono disponibili collegamenti mysql, come le opzioni Perl o Pyhon che hai menzionato. Leggere i file CVS in queste lingue è facile, quindi potresti eseguire tutte le seguenti operazioni in un unico script:

  1. blocca tabelle
  2. inizia transazione
  3. leggi i file CSV di input
  4. fai domande come ID max
  5. regola i dati di input in modo che corrispondano al layout della tabella
  6. inserisci i dati nelle tabelle
  7. se non si sono verificati errori, eseguire il commit della transazione