Script Perl para consultas Mysql

Iniciado por ^Tifa^, 9 Noviembre 2007, 18:18 PM

0 Miembros y 1 Visitante están viendo este tema.

^Tifa^

He iniciado un simple y extenso script de perl que hace consultas y subconsultas a Mysql, Postgresql y proximamente Oracle :D

El script en si es basicamente para usuarios que no saben casi nada de SQL y esto les puede server, Bien, el script iba a ser demasiado extenso para 1 solo archivo, asi que lo dividi en varios modulos, por el momento solo publicare el script completo hacia Mysql ya que en el modulo Postgresql me faltan algunas subconsultas que completar y testear en mi PC.

He aqui el main.pl del script:

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Mysql;
use mysql1;
use msql1;
use pgs1;
use oracle1;


printf " ***************************************\n ";
printf " **************  Genesix ***************\n ";
printf " ********** Version 1.0 **************\n ";
printf " ********* Autor:: Marian S. *********\n" ;
printf " Escriba la base de datos que le gustaria utilizar\n";
printf "\n";
printf " 1 - Mysql, 2 -Postgresql, 3 - Oracle  :  Seleccione un numero para continuar  ";
my $opcion = <STDIN> ;
chomp $opcion;
if ($opcion eq 1) {  Mysql(); }
elsif ($opcion eq 2) { Postgresql(); }
elsif ($opcion eq 3) { Oracle(); }

sub Mysql {
my $hostname = "localhost";
printf "Bienvenido/as al cliente de consultas Mysql :  ";
printf "Indique que quiere hacer\n";
printf " 1 - Crear una tabla\n";
printf " 2 - Eliminar una tabla\n";
printf " 3 - Crear un backup de una base de datos y todas sus tablas\n" ;
printf " 4 - Otorgar permisos a una base de datos a un usuario\n" ;
printf " 5 - Eliminar una Base de Datos\n";
printf " 6 - Modificar/Alterar una tabla\n" ;
printf " 7 - Remover permisos de una base de datos a un usuario\n";
printf " 8 - Crear una base de datos\n";
my $query = <STDIN>;
chomp $query;
if ($query eq 1) { &mysql1::mysql2(); }
elsif ($query eq 2) { &mysql1::mysql3(); }
elsif ($query eq 3) { &mysql1::mysql4(); }
elsif ($query eq 4) { &mysql1::mysql5(); }
elsif ($query eq 5) { &mysql1::mysql6(); }
elsif ($query eq 6) { &msql1::msql2(); }
elsif ($query eq 7) { &msql1::msql3(); }
elsif ($query eq 8) { &msql1::msql4(); }
} ;

sub Oracle {
printf "Bienvenido/a al cliente de consultas Oracle : ";
printf "Especifique que desea hacer\n";
printf " 1 - Crear una tabla\n";
printf " 2 - Eliminar una tabla\n";
printf " 3 - Crear un backup de una base de datos y todas sus tablas\n" ;
printf " 4 - Otorgar permisos a una base de datos a un usuario\n" ;
printf " 5 - bla bla\n";
my $query = <STDIN>;
chomp $query;
if ($query eq 1) { &oracle1::oracle2(); };

} ;

sub Postgresql {
printf "Bienvenido/a al cliente de consultas Postgresql : ";
printf "Especifique que desea hacer\n";
printf " 1 - Crear una tabla\n";
printf " 2 - Eliminar una tabla\n";
printf " 3 - Crear un backup de una base de datos y todas sus tablas\n" ;
printf " 4 - Otorgar permisos a una base de datos a un usuario\n" ;
printf " 5 - bla bla\n";
my $query = <STDIN>;
chomp $query;
if ($query eq 1) { &pgs1::pgs2(); };

} ;

1;


Bien Como dije divide en modulos el programita solo publicare los modulos de Mysql, ya que los de Postgresql aun estan incompletos aunque los pocos que estan habilitados funcionan

Primer modulo de Mysql:

package mysql1;

my $hostname = "localhost";

sub mysql2 {
printf "Indique el nombre de la base de datos a usar : ";
my $database = <STDIN>;
chomp $database;
printf "Nombre de la tabla a crear : " ;
my $table = <STDIN>;
chomp $table ;
printf "Inserte los registros que tendra la nueva tabla : Ejemplo: 'nombre varchar(30), apellidos varchar(30), edad int;' : ";
my $registro = <STDIN>;
chomp $registro;
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("create table $table ($registro);") or die ("$!\n");
};

sub mysql3 {
printf "Indique el nombre de la base de datos a usar : ";
my $database = <STDIN>;
chomp $database;
printf "Nombre de la tabla a eliminar : ";
my $delete = <STDIN>;
chomp $delete ;
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("drop table if exists $delete;") or die ("$!\n");
};

sub mysql4 {
my $backup = "/usr/bin/mysqldump";
my $HOME = "~" ;
my $archivo = "backup.sql";
my $directorio = "$HOME/backup" ;
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
printf "Indique el nombre de la DB de la cual se hara el backup  :  " ;
my $table = <STDIN>;
chomp $table;
my $ubicacion = `cd $directorio 2>/dev/null || mkdir -p ${directorio} && cd $directorio && $backup --opt --user=$user --password=$pass $table > $archivo && tar -cvf $archivo.tar *.sql && compress $archivo.tar && rm *.sql` ;
sprintf $ubicacion ;
printf "El backup fue creado satisfactoriamente, Backup guardado en $directorio\n";
};

sub mysql5 {
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
printf "Indique el nombre del usuario que sera privilegiado : ";
my $user1 = <STDIN>;
chomp $user1;
printf "Indique el nombre de la DB a la cual se le dara privilegios a dicho usuario : ";
my $db = <STDIN>;
chomp $db;
printf "Privilegios a otorgar ::: \n";
printf "1 - Garantizar todos los privilegios (Grant All)\n";
printf "2 - Garantizar solo permisos de crear, eliminar, actualizar (Grant usage, create, update, eliminar)\n";
printf "3 - Deseo introducir los permisos que este usuario tendra : ";
my $eleccion = <STDIN>;
chomp $eleccion;
if ($eleccion eq 1) { my $conexión = Mysql->connect("$hostname", "$db", "$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("grant all privileges on $database.* to $user1@$hostname identified by $pass with grant option;") or die ("$!\n");
}
elsif ($eleccion eq 2) { my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("grant usage, create, update, drop on $database.* to $user1@$hostname identified by $pass with grant option;") or die ("$!\n"); }
elsif ($eleccion eq 3) { printf "Introduzca los permisos a garantizar separados por comas y con espacio Ejemplo:: drop, update, alter  sin \ entrecomillar la palabra, ni finalizar con punto y coma ";
my $opccion = <STDIN>;
chomp $opccion;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("grant $opccion on $database.* to $user1@$hostname identified by $pass with grant option;") or die ("$!\n");
}
};

sub mysql6 {
printf "Indique el nombre de la base de datos a Eliminar : ";
my $database = <STDIN>;
chomp $database;
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("drop database $database;") or die ("$!\n");
};

1;


Segundo Modulo del Mysql;

package msql1;

my $hostname = "localhost";

sub msql2 {
printf "Indique el nombre de su usuario :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
printf "Indique el nombre de la base de datos donde esta la tabla : ";
my $database = <STDIN>;
chomp $database;
printf "Indique Nombre de la Tabla a utilizar : " ;
my $table = <STDIN>;
chomp $table ;
printf "Que desea modificar en la Tabla\n";
printf " 1 - Agregar un registro, 2 - Modificar un registro, 3 - Eliminar un registro ; Seleccione un numero para continuar : ";
my $opcion = <STDIN>;
chomp $opcion;
if ($opcion eq 1) { Add(); }
elsif ($opcion eq 2) { Mod(); }
elsif ($opcion eq 3) { Drop(); }
sub Add {
printf "Introduzca el nuevo dato que desea agregar Ex: 'email varchar(30), edad int' insertar datos no encapsular entre comillas \
no colocar punto y coma al final tampoco : ";
my $data = <STDIN>;
chomp $data;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("alter table $table add ($data);") or die ("$!\n");
sub Mod {
printf "Indique el registro a modificar Ex: columna disponible - nombre varchar(20) - Modificamos ::  'nombre varchar(30)' - Donde el registro nombre fue cambiado la capacidad de data a guardar con varchar(30)' \ Introducir datos sin entrecomillar y sin punto y coma al final : ";
my $seleccion = <STDIN>;
chomp $seleccion;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("alter table $table modify $seleccion;") or die ("$!\n");
}
sub Drop {
printf "Introduzca la palabra/columna que desea Eliminar de la Tabla , Ex: nombre : ";
my $data = <STDIN>;
chomp $data;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("alter table $table drop $data;") or die ("$!\n");
}
}
};

sub msql3 {
printf "Indique el nombre de su usuario (ROOT para poder eliminar permisos) :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
printf "Indique el nombre del usuario al cual se le removeran los privilegios : ";
my $user1 = <STDIN>;
chomp ($user1);
printf "Indique el nombre de la base de datos : ";
my $database = <STDIN>;
chomp $database;
printf "Indique Nombre de la Tabla (por motivos de conexión) : " ;
my $table = <STDIN>;
chomp $table ;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("revoke all privileges on $database.* from $user1@$hostname;") or die ("$!\n");
};

sub msql4 {
printf "Indique el nombre de su usuario  :  ";
my $user = <STDIN>;
chomp $user;
printf "Indique su contraseña  :  " ;
my $pass = <STDIN>;
chomp $pass;
printf "Indique el nombre del usuario al cual se le removeran los privilegios : ";
my $user1 = <STDIN>;
chomp ($user1);
printf "Indique el nombre de la base de datos : ";
my $database = <STDIN>;
chomp $database;
printf "Indique Nombre de la Tabla (por motivos de conexión) : " ;
my $table = <STDIN>;
chomp $table ;
my $conexión = Mysql->connect("$hostname","$database","$user","$pass") or die ("$!\n") ;
my $select = $conexión->selectdb("$database") or die ("$!\n");
my $peticion = $conexión->query("create database $database;") or die ("$!\n");
};

1;


La parte de Mysql esta practicamente completa a mi entender a lo mejor estoy obviando algo, pero por el momento cumple los objetivos de donde trabajo, varios empleados estan usando este script para hacer subconsultas y consultas rapidas a Mysql y Postgresql.

Obvio el modulo que he creado de Postgresql ya que aun esta incompleto pero las pocas funciones que hace funcionan :) dicho scriptcito esta siendo muy utilizable por ciertos empleados donde laboro, ya que se sienten a gusto con el que me han pedido que haga el mismo script pero version grafica para los usuarios de Windows, y he estado creando el mismo software en version grafica con Tk. Vere como me va hasta ahora muy positivo.

Espero que a alguien le sirva.