un bash file per gestire agevolmente procedure e viste mysql
Pubblicato da fuliggians su 10 Settembre 2007
se sei un bioinformatico bravo e buono ti avran chiesto gentilmente almeno una volta di gestire il DB opensource (mysql, naturalmente) del tuo laboratorio; e questo col tempo diventerà sempre più complesso, con una proliferazione di query, stored procedure e viste. Il tutto in un organizzato disordine. Personalmente trovo utile cercare di tenere quanto più possibile le operazioni dentro mysql, tanto da preferire utilizzare il comando EVENT piuttosto che il CRONTAB del server. Scelta personale. Oggi volevo mostrarvi un piccolo trucchetto che mi sono inventato per gestire ed automatizzare molte delle situazioni che possono capitare.
La situazione (particolare) che mi ritrovo ad affrontare è questa: il database è popolato quotidianamente da una grande mole di dati (spettrometria?, microarray?, quel che vuoi). Ogni giorno viene creata una tabella che si chiama MOLEDIDATI_data. E rimane lì come archivio.
Ora immaginate di dover fare una qualunque operazione su una tabella passata. Dovresti scrivere o modificare una stored procedure per esempio indicando quale tabella usare. Personalmente preferisco automizzare quanto più possibile. Ho costruito allora una struttura del genere:
- Prima ho creato un database “action” (CREATE DATABASES action;)
- poi ho creato una tabella “listprocedure” così fatta:
DROP TABLE IF EXISTS action.listprocedure;CREATE TABLE action.listprocedure (
indice int(10) unsigned NOT NULL AUTO_INCREMENT,
tipo varchar(45) NOT NULL,
query text NOT NULL,
PRIMARY KEY (indice)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
- a questo punto posso popolare la tabella listprocedure con qualunque azione che voglio operare su una GENERICA tabella, per esempio gli piazzo dentro la creazione di una stored procedure (in questo caso semplicissima) e la sua relativa CALL:
INSERT INTO action.listprocedure (query) VALUES (‘DELIMITER $$
DROP PROCEDURE IF EXISTS DATABASE.nomeacaso $$
CREATE PROCEDURE DATABASE.nomeacaso ()
BEGIN
SELECT * FROM DATABASE.MOLEDIDATI_datagenerica;
END $$DELIMITER ;
CALL DATABASE.nomeacaso;’)
a questo punto sono pronto. Mi basta scrivere un piccolo file bash (che chiameremo pippo.sh) che fa da motore alla sostituzione dei nomi all’interno della query:
#!/bin/bash
indiceProc=$1
day=$2
result=`mysql -h [host] -u root –password=[psw]<<EOF
use action; SELECT query FROM action.listprocedure where indice=$indiceProc;
EOF
`
updated=${result//datagenerica/$day}
for line in $updated; do
if [ $line != "query"]; then
echo “$line” >engineUpdated.sql
fi
done#eseguo
mysql -h [host] -u root –password=[pwd]<engineUpdated.sql
a questo punto sono a posto. Mi basta lanciare il bash come:
pippo.sh 1 010307 (che lancia la query con indice 1 sulla tabella del 01 Marzo 2007)
il vantaggio è che non devo fare una specifica query per ogni tabella e tutte le query rimangono dentro al DB in un formato “generico”
Feed del blog
Digg/fuliggians
Flickr/fuliggians
Myspace/radioborsotto
Friendster/Fuliggians
Del.icio.us/fuliggians
Blog/Fuliggians