• Publicidad

Conexión a base de datos a través de un pm

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-29 13:04 @586

Estoy aprendiendo a manejar base de datos y para realizar mis pruebas hice lo siguiente:

1. Primero creé ConectarBD.pm

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package ConectarDB;
  3. use strict;
  4. use DBI;
  5.  
  6. # VARIABLES A UTILIZAR
  7.  
  8. my $db_user   = "postgres";
  9. my $db_pass   = "postgres";
  10. my $host_name = "localhost";
  11. my $db_name   = "sicre";
  12.  
  13. # DEFINICION DE LA CONEXION
  14.  
  15. my $q_string = "dbi:Pg:host=$host_name;database=$db_name";
  16.  
  17. sub connect{
  18. return (DBI->connect ($q_string, $db_user, $db_pass,
  19. {PrintError => 0, RaiseError => 1}));
  20. }
  21. 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Después desarrollé

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my($dbh,$sth);
  4.  
  5. $dbh = ConectarDB->connect();
  6.  
  7. $sth = $dbh->prepare('SELECT alffechanac FROM talumnado WHERE alanombre = ? AND alapaterno = ? AND alamaterno = ?') or die("Couldn't prepare statement: " . $dbh->errstr);
  8.  
  9. $sth->execute("REBECA","SANCHEZ","GONZALEZ") or die("Couldn't execute statement: " . $sth->errstr);
  10.  
  11. my $fecha = $sth->fetchrow_array();
  12.  
  13. print '\n $fecha';
  14.  
  15. $sth->finish;
  16. $dbh->disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al ejecutar mi programa me marca lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can´t locate object method connect via package ConectarDB (perhaps you forgot to load ConectarBD?) at line 5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Estoy utilizando Perl Express bajo Windows.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Publicidad

Re: Conexión a base de datos a través de un pm

Notapor explorer » 2011-04-29 13:57 @623

Creo que falta una línea

use ConectarDB;

en el programa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-29 14:37 @650

Ya lo resolví, tenía invertidas 2 letras, lo definí así ConectarDB.pm y lo llamaba así ConectarBD.

Gracias
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-29 15:34 @690

Para darle mayor peso al llamado del *.pm sería conveniente pasarle como parámetros los datos de conexión, como tipo de base, user, password, etc, lo mismo que las rutinas de consulta a base de datos, es decir, poner como parámetro la sentencia de SQL, ¿cómo lo hago?
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Conexión a base de datos a través de un pm

Notapor explorer » 2011-04-29 17:26 @768

En el programa tienes esta línea:

$dbh = ConectarDB->connect();

donde estás indicando que estás llamando al método connect(), del módulo ConectartDB. Y si te fijas, en los paréntesis, no estás indicando ningún parámetro.

De la misma manera podrías pasarle como parámetros a connect(), los argumentos necesarios para hacer la conexión. Y en el módulo, leer los argumentos pasados.

Por ejemplo, en el módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub connect {
  2.     my($db, $usuario, $passwd) = @_;
  3.  
  4.     return (DBI->connect ($db, $usuario, $passwd, {PrintError => 0, RaiseError => 1}));
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y luego en el programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $dbh = ConectarDB->connect("dbi:Pg:host=localhost;database=basedatos", "postgres", "postgres");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

de ti depende qué argumentos quieres pasar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-29 17:51 @785

Gracias, adicionalmente creé una base de datos en PostgreSQL de salida llamada DePaso que tiene una tabla llamada TBSalida y tiene los siguientes campos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  llave integer NOT NULL,              -- llave de la tabla
  alumnonombre character varying(60),  -- Nombre del alumno
  alumnopaterno character varying(60), -- apellido paterno
  alumnomaterno character varying(60), -- apellido materno
  "fechaNac" date                      -- fecha de nacimiento
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Utilizo procedimientos en pm, éstos son (el primero me sirve para leer los datos y el segundo para guardar datos):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #-----Para leer datos
  2. #!/usr/bin/perl
  3. package ConectarDB;
  4. use strict;
  5. use DBI;
  6.  
  7. # VARIABLES A UTILIZAR
  8.  
  9. my $db_user   = "postgres";
  10. my $db_pass   = "postgres";
  11. my $host_name = "localhost";
  12. my $db_name   = "sicre";
  13.  
  14. # DEFINICION DE LA CONEXION
  15.  
  16. my $q_string = "dbi:Pg:host=$host_name;database=$db_name";
  17.  
  18. sub connect{
  19. return (DBI->connect ($q_string, $db_user, $db_pass,
  20. {PrintError => 0, RaiseError => 1}));
  21. }
  22. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #-------------Para guardar datos
  2. #!/usr/bin/perl
  3. package ConectarDBs;
  4. use strict;
  5. use DBI;
  6.  
  7. # VARIABLES A UTILIZAR
  8.  
  9. my $db_users   = "postgres";
  10. my $db_passs   = "postgres";
  11. my $host_names = "localhost";
  12. my $db_names   = "DePaso";
  13.  
  14. # DEFINICION DE LA CONEXION
  15.  
  16. my $q_string = "dbi:Pg:host=$host_names;database=$db_names";
  17.  
  18. sub connects{
  19. return (DBI->connect ($q_string, $db_users, $db_passs,
  20. {PrintError => 0, RaiseError => 1}));
  21. }
  22. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el programa que lee y guarda información es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use ConectarDB;
  4. use ConectarDBs;
  5.  
  6. my ($dbhs,$sths);
  7. my ($dbh,$sth,@datos_personales);
  8. my $cuenta=1;
  9.  
  10. #-------------- Conexion a las base de datos
  11.  
  12. $dbh  = ConectarDB->connect();
  13. $dbhs = ConectarDBs->connects();
  14.  
  15. #-------------- Preparacion de la extraccion de informacion
  16.  
  17. $sth = $dbh->prepare('SELECT alffechanac, alanombre, alapaterno, alamaterno FROM talumnado WHERE alanombre like ?') or die("Couldn't prepare statement: " . $dbh->errstr);
  18. $sth->execute("REB%") or die("Couldn't execute statement: " . $sth->errstr);
  19.  
  20. #------------- Preparacion del INSERT de datos a la nueva tabla
  21.  
  22. my $prepara_insert = 'insert into TBSalida(llave,fechaNac,alumnonombre,alumnopaterno,alumnomaterno) values (?,?,?,?,?);';
  23. $sths = $dbhs->prepare($prepara_insert);
  24.  
  25. print "hasta aqui pase correctamente\n";
  26.  
  27. while(@datos_personales = $sth->fetchrow_array()){
  28.         print "$cuenta $datos_personales[0] $datos_personales[1] $datos_personales[2] $datos_personales[3]\n";
  29.         $sths->execute("$cuenta","$datos_personales[0]","$datos_personales[1]","$datos_personales[2]","$datos_personales[3]");
  30.         $cuenta +=1;
  31. }
  32. $sth->finish;
  33. $dbh->disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al ejecutar el programa me marca error en la línea donde ejecuto el INSERT; me dice:

DBD::Pg::st execute failed: ERROR: relation 'tbsalida' doesn´t exist al line 29, que es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $sths->execute("$cuenta","$datos_personales[0]","$datos_personales[1]","$datos_personales[2]","$datos_personales[3]");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No encuentro qué me falta.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Conexión a base de datos a través de un pm

Notapor explorer » 2011-04-29 18:39 @818

El error dice que no existe la tabla TBSalida en la base de datos de destino.

Otra cosa... Si te fijas un poco... verás que los dos módulos Conecta... son el mismo... variando solo los argumentos de conexión... ergo... estás repitiendo código: con solo un módulo lo podrías resolver.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-29 19:36 @858

Dejé solo un archivo pm de esta forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package ConectarDB;
  3. use strict;
  4. use DBI;
  5.  
  6. # VARIABLES A UTILIZAR
  7.  
  8. my $db_user   = "postgres";
  9. my $db_pass   = "postgres";
  10. my $host_name = "localhost";
  11. my $db_name   = "sicre";
  12. my $db_names  = "DePaso";
  13.  
  14. # DEFINICION DE LA CONEXION
  15.  
  16. my $q_string  = "dbi:Pg:host=$host_name;database=$db_name";
  17. my $q_strings = "dbi:Pg:host=$host_name;database=$db_names";
  18.  
  19. sub connect{
  20. return (DBI->connect ($q_string, $db_user, $db_pass,
  21. {PrintError => 0, RaiseError => 1}));
  22. }
  23. sub connects{
  24. return (DBI->connect ($q_strings, $db_user, $db_pass,
  25. {PrintError => 0, RaiseError => 1}));
  26. }
  27. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el programa quedo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use ConectarDB;
  4.  
  5. my ($dbhs,$sths);
  6. my ($dbh,$sth,@datos_personales);
  7. my ($sfecha,$snombre,$spaterno,$smaterno);
  8. my $cuenta=1;
  9.  
  10. #-------------- Conexion a las base de datos
  11.  
  12. $dbh  = ConectarDB->connect();
  13. $dbhs = ConectarDB->connects();
  14.  
  15. #-------------- Preparacion de la extraccion de informacion
  16.  
  17. $sth = $dbh->prepare('SELECT alffechanac, alanombre, alapaterno, alamaterno FROM talumnado WHERE alanombre like ?') or die("Couldn't prepare statement: " . $dbh->errstr);
  18. $sth->execute("REB%") or die("Couldn't execute statement: " . $sth->errstr);
  19.  
  20. #------------- Preparacion del INSERT de datos a la nueva tabla
  21.  
  22. my $prepara_insert = 'insert into tbdatos(llave,fechanac,alumnonombre,alumnopaterno,alumnomaterno) values (?,?,?,?,?);';
  23. $sths = $dbhs->prepare($prepara_insert);
  24.  
  25. print "hasta aqui pase correctamente\n";
  26.  
  27. while(@datos_personales = $sth->fetchrow_array()){
  28.         print "$cuenta $datos_personales[0] $datos_personales[1] $datos_personales[2] $datos_personales[3]\n";
  29.         $sfecha    = $datos_personales[0];
  30.         $snombre   = $datos_personales[1];
  31.         $spaterno  = $datos_personales[2];
  32.         $smaterno   = $datos_personales[3];
  33. #------ $sths->execute("$cuenta","$datos_personales[0]","$datos_personales[1]","$datos_personales[2]","$datos_personales[3]");
  34.         $sths->execute("$cuenta","$sfecha","$snombre","$spaterno","$smaterno");
  35.  
  36.         $cuenta +=1;
  37. }
  38. $sth->finish;
  39. $sths->finish;
  40. $dbh->disconnect;
  41. $dbhs->disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y todo funcionó correctamente. Gracias.
Última edición por explorer el 2011-04-30 05:00 @250, editado 1 vez en total
Razón: Formateado con Perl
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Conexión a base de datos a través de un pm

Notapor explorer » 2011-04-30 05:25 @267

Creo que no le has pillado el truco...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. # Módulo que conecta con la base de datos
  4. package ConectarDB;
  5. use strict;
  6. use DBI;
  7.  
  8. sub connect {
  9.     my ($q_string, $db_user, $db_pass) = @_;
  10.  
  11.     return (
  12.         DBI->connect(
  13.             $q_string, $db_user, $db_pass,
  14.             { PrintError => 0, RaiseError => 1 }
  15.         )
  16.     );
  17. }
  18.  
  19. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. # Programa principal
  4. use ConectarDB;
  5.  
  6. # VARIABLES A UTILIZAR
  7. my $db_user   = "postgres";
  8. my $db_pass   = "postgres";
  9. my $host_name = "localhost";
  10. my $db_name   = "sicre";
  11. my $db_names  = "DePaso";
  12.  
  13. # DEFINICION DE LA CONEXIÓN
  14. my $q_string  = "dbi:Pg:host=$host_name;database=$db_name";
  15. my $q_strings = "dbi:Pg:host=$host_name;database=$db_names";
  16.  
  17.  
  18. my ($dbhs,$sths);
  19. my ($dbh,$sth,@datos_personales);
  20. my ($sfecha,$snombre,$spaterno,$smaterno);
  21. my $cuenta = 1;
  22.  
  23. #-------------- Conexión a las base de datos
  24. $dbh  = ConectarDB->connect($q_string,  $db_user, $db_pass);
  25. $dbhs = ConectarDB->connect($q_strings, $db_user, $db_pass);
  26.  
  27. #-------------- Preparacion de la extraccion de informacion
  28. $sth
  29.     = $dbh->prepare('SELECT alffechanac, alanombre, alapaterno, alamaterno FROM talumnado WHERE alanombre like ?')
  30.     or die("Couldn't prepare statement: " . $dbh->errstr);
  31.  
  32. $sth->execute("REB%")
  33.     or die("Couldn't execute statement: " . $sth->errstr);
  34.  
  35. #------------- Preparacion del INSERT de datos a la nueva tabla
  36. my $prepara_insert
  37.     = 'insert into tbdatos(llave,fechanac,alumnonombre,alumnopaterno,alumnomaterno) values (?,?,?,?,?);';
  38.  
  39. $sths = $dbhs->prepare($prepara_insert);
  40.  
  41. #------------- Copia de los usuarios
  42. while(@datos_personales = $sth->fetchrow_array()){
  43.     print "$cuenta @datos_personales\n";
  44.     $sfecha    = $datos_personales[0];
  45.     $snombre   = $datos_personales[1];
  46.     $spaterno  = $datos_personales[2];
  47.     $smaterno  = $datos_personales[3];
  48.  
  49. #------ $sths->execute($cuenta, @datos_personales);
  50.     $sths->execute($cuenta, $sfecha, $snombre, $spaterno, $smaterno);
  51.  
  52.     $cuenta++;
  53. }
  54.  
  55. $sth->finish;
  56. $sths->finish;
  57. $dbh->disconnect;
  58. $dbhs->disconnect;
  59.  
  60. print "$cuenta registros pasados\n";
  61.  
  62. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Conexión a base de datos a través de un pm

Notapor Hector Gutierrez » 2011-04-30 11:18 @512

Gracias, ya tenía contemplado el paso de argumentos para darle mayor fuerza y lo que estoy trabajando es generar una herramienta que me permita tomar información de diversas bases de datos (Oracle, SQL Server, PostgreSQL), hojas de Excel y archivos de texto y crear una base de datos que haga converger lo anterior. El siguiente paso es graficación, hasta fabricar un generador de pantallas.

Cualquier duda que tenga te molestaré sobre el tema en particular, saludos.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados