Mostrando entradas con la etiqueta conexion db. Mostrar todas las entradas
Mostrando entradas con la etiqueta conexion db. Mostrar todas las entradas

martes, 30 de septiembre de 2014

Scrip shell consulta base de datos y guarda resultados a un archivo

En el siquiente ejemplo veremos como hacer consultas mediante un archivo bash y guardar los resultados en un archivo de texto plano, para esto ocuparemos Mysql y 4 tablas: Emrpesa, Llamadas, Opciones y Transacciones. Este archivo bash sacará en 3 archivos de texo la info de cada Llamada.

La estructura de cada tabla seria así:

Tabla Empresa

Descripción: Aquí se guardaran las distintas empresas telefónicas como Claro, Entel, Movistar, etc. y por cada una se hara un informe el cual tendra 3 archivos: Llamadas, Opciones y Transacciones.

id_empresa (autoincremental),
nombre_empresa

Tabla Llamadas:

Descripción: Registra cada llamda hecha al menú de autoatención de cada empresa.

id_llamada (autoincremental),
id_empresa,
duracion_total,
numero_origen,
numero_destino,
fecha_inicio,
fecha_fin


Tabla Opciones:

Descripción: Registra las opciones presinadas por el cliente al momento de llamar a la central (Menú de autoatención como por ejemplo  Entel 103)

id_opcion (autoincremental)
id_llamada,
opcion_presionada

Tabla Transacciones:

Descripción : Cuando se presiona una opción del menú de autoatención, se gatillan transacciones, las cuales se registran en esta tabla.

id_trx (autoincremental),
id_llamada,
nombre_trx,
resultado,
duracion

nota: los campos que estan en negrita son referencias de otras tablas, por lo que la relacion entre estas tablas es de 1 a muchas.

Generamos el archivo bash que se guarda con extención .sh, ejemplo: informe.sh y se puede ejecutar así:

1) ./informe.sh
2) sh informe.sh
3) bash informe.sh

#!/bin/bash
user="usuario"
pass="xxxxxx"
db="BaseDeDatoAConectarMysql"


#opcines de columnas en Mysql
opc="--skip-column-names"


#Se necesita que el archivo tenga en su nombre la fecha de ayer
fecha=$(date --date="yesterday" +"%Y%m%d")


#Se quiere 3 informes que sean del dia anterior, ejemplo si hoy es 02/08/2014, entonces

#se requiere un informe de todo el día de ayer de '01/08/2014' hasta '01/08/2014 23:59:59'
#ponermos el intervalo de dias en -1 para restar un dia
intervalo="-1"

#se crea consulta y conexion a mysql. Esta obtiene todas las empresas que seran consultadas #empresa de telefonia (Tabla Empresa).


dbquery=$(mysql -u $user -p$pass $opc -e "use $db;SELECT id_empresa FROM Empresa ")

#se guardan los resultados en un array
arrayApp=($(for i in $dbquery;do echo $i;done))

#corroboramos que esten todos los datos en el array. Descomentar la siguiente linea
#echo ${arrayApp[@]};


#se recorre el array para ejecutar las querys
for i in ${arrayApp[@]}
do
nameFile1="_llamadas_$fecha.txt";
query="SELECT   LLA.id_llamada ID_LLAMADA,
LLA.id_empresa ,
LLA.duracion_total ,
LLA.numero_origen,
LLA.numero_destino,
LLa.fecha_inicio,
LLA.fecha_fin,
INTO OUTFILE '/rutaDondeSeGuardara/
$i$nameFile1' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM LLAMADAS LLA
WHERE LLA.fecha_inicio>= (CURDATE()
$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND LLA.fecha_fin<= (CURDATE()
$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)
AND LLA.id_empresa='
$i'
ORDER BY LLa.fecha_inicio ASC;"
;
mysql -u $user -p$pass -e "use $db;$query"

nameFile2="_opciones_$fecha.txt";
query="SELECT OPC.id_llamada ID_LLAMADA,
OPC.OPCION OPCION
INTO OUTFILE '/
rutaDondeSeGuardara/$i$nameFile2' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM OPCIONES OPC,
LLAMADAS LLA
WHERE 
LLA.fecha_inicio >= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND 
LLA.fecha_fin <= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)

AND LLA.id_empresa='$i'
AND 
LLA.id_llamada=OPC.id_llamada

ORDER BY LLA.fecha_inicio ASC;";
mysql -u $user -p$pass -e "use $db;$query";

nameFile3="_transac_$fecha.txt";
query="SELECT TRX.id_llamada ID_LLAMADA,
TRX.nombre_trx,
TRX.resultado,
TRX.duracion
INTO OUTFILE '/
rutaDondeSeGuardara/$i$nameFile3' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM Llamadas LLA,
Transacciones TRX
WHERE 
LLA.fecha_inicio >= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND 
LLA.fecha_fin <= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)

AND LLA.id_empresa='$i'
AND LLA.id_llamada=TRX.id_llamada
ORDER BY LLA.fecha_inicio ASC"
;
mysql -u $user -p$pass -e "use $db;$query";
done



Nota: este codigo fue testeado en un Shell, pero se cambiaron las tablas de las consultas, las cuales no estan testeadas, por lo que puede existir un error de consultas.

viernes, 2 de mayo de 2014

Script bach que ejecuta una sentencia Mysql


A continuación un script que ejecuta sentencia Mysql

#!/bin/bash
#crea archivo log, donde dice ruta ponemos la ruta donde queremos que este
touch /ruta/operacion.log
#permisos del archivo
chmod 755 /ruta/operacion.log
#usuario del archivo
chown miusuario:miusuario operacion.log
echo -e "*********COMIENZA ************" >> /ruta/operacion.log
#le ponemos la fecha de ejecucion
date >> /ruta/operacion.log
#conexion y consulta a la DB, en caso de que devuelva algo lo tiramos al log
 mysql -u root -ppassword basedato -e "SELECT NOW();" >> /ruta/operacion.log
echo -e "*********FIN ****************" >> /home/encuestasIVR/operacion.log