Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Conectar a MySQL
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Mensaje Mar Jun 13, 2006 7:10 am
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Conectar a MySQL Responder citando

Hola a todos.
os cuento, tengo una base de datos de mysql llamada "prueba" con dos tablas, en las cuales quiero introducir datos desde un archivo. Para eso he creado un script de Perl que funcionaba perfectamente con postgreSQL, pero con MySQL no me funciona.
el codigo del script es:
Código:
#usr/bin/perl -w
package DBD::mysql;
use DBI;
use strict;

# Prácticas de DBI y bases de datos biológicas
# Script de inserción de entradas en formato SWISSPROT en la base de datos

my($dbhost)='localhost';
my($dbname)='prueba';        # Teneis que introducir el nombre de la base de datos
                                # que os corresponda
my($dbuser)='root';        # Teneis que poner el nombre que os dé
my($dbpass)='ana';        # Teneis que poner la password que os dé

# Comprobación del número de parámetros
if(scalar(@ARGV)>0) {
        local(*INFILE);
        my($file,$line);
        my($errflag,$dbh);

        my(@acc,$id,$lastdate,$description,$sequence,$molw,$accnumber,$ac);
        my($readingseq);

        my($sthsw,$sthacc);

        # Apertura de la conexión con la base de datos
        # Establecemos que nosotros manejamos los errores,
        # y que vamos a trabajar con transacciones directamente
        $dbh = DBI->connect("dbi:mysql:dbname=$dbname;host=$dbhost",
                                $dbuser,$dbpass,{RaiseError => 0, AutoCommit => 0});

        # ¿Se ha podido establecer la conexión?
        die "Ha habido un problema al conectar con la base de datos: " . $DBI::errstr  unless(defined($dbh));

        # Preparación de las operaciones de inserción a realizar repetidamente
        # (Debería hacer un chequeo aquí, para comprobar que funcionan)
        $sthsw=$dbh->prepare('INSERT INTO SWISSENTRY VALUES (?,?,?,?,?,?)');
        $sthacc=$dbh->prepare('INSERT INTO ACCNUMBERS(main_accnumber,accnumber) VALUES (?,?)');

        # Procesamiento de cada fichero
        foreach $file (@ARGV) {
                # Intento de abrir el fichero
                if(open(INFILE,$file)) {
                        print "Procesando fichero $file\n";

                        # Por seguridad, limpio las variables
                        @acc=();
                        $id='';
                        $lastdate='';
                        $description='';
                        $sequence='';
                        $molw='';
                        $readingseq=undef;

                        # Procesamiento del fichero, leyendo línea a línea
                        while($line=<INFILE>) {
                                # Lo primero, quitar el salto de línea
                                chomp($line);

                                # Detección del final del registro
                                if($line =~ /^\/\//) {
                                        # Cuando se ha terminado de leer un
                                        # registro hay que proceder a guardar
                                        # los datos en la base de datos

                                        $description=undef  if($description eq '');

                                        # Impresión de comprobación
                                        print "ACC: $acc[0] ; ID: $id ; Last: $lastdate\n";

                                        # Ejecuto el resto de inserciones cuando no hay error
                                        if($sthsw->execute($acc[0],$id,$lastdate,$description,$sequence,$molw)) {
                                                foreach $accnumber (@acc) {
                                                        unless($sthacc->execute($acc[0],$accnumber)) {
                                                                # Ha ocurrido un error de inserción
                                                                $errflag=1;
                                                                last;
                                                        }
                                                }
                                        } else {
                                                # Marco el error si se produce
                                                $errflag=1
                                        }

                                        # ¿Se han podido realizar las inserciones?
                                        if(defined($errflag)) {
                                                warn "Error al insertar: " . $DBI::errstr;
                                                $dbh->rollback();
                                                # No voy a seguir procesando el fichero
                                                last;
                                        } else {
                                                # Una vez guardados los datos, tenemos
                                                # que borrar el contenido de las variables
                                                # para evitar fallos en las iteraciones
                                                @acc=();
                                                $id='';
                                                $lastdate='';
                                                $description='';
                                                $sequence='';
                                                $molw='';
                                                $readingseq=undef;
                                        }

                                        next;
                                }

                                # ¿Estoy leyendo una secuencia?
                                if(defined($readingseq)) {
                                        # Quito todos los espacios intermedios
                                        $line =~ s/\s+//g;

                                        # Y concateno
                                        $sequence .= $line;

                                # Como no la estoy leyendo, busco los patrones apropiados
                                } elsif($line =~ /^SQ.+[^0-9](\d+) MW/) {
                                        # Extracción del peso molecular
                                        # y comienzo de secuencia
                                        $molw=$1;

                                        $readingseq=1;

                                } elsif($line =~ /^ID   ([a-zA-Z0-9_]+)/) {
                                        # Identificador
                                        $id = $1;
                                } elsif($line =~ /^DT   (\d{2}-[A-Z]{3}-\d{4}).+annotation update/) {
                                        # Fecha de la última actualización
                                        $lastdate = $1;
                                } elsif($line =~ /^AC   (.+)/) {
                                        # Los accnumber, que pueden estar en varias líneas
                                        $ac=$1;
                                        # Elimino los espacios
                                        $ac =~ s/\s+//g;

                                        # Rompo por los puntos y coma, y
                                        # añado a la lista de accnumber
                                        push(@acc,split(/;/,$ac));
                                } elsif($line =~ /^DE   (.+)/) {
                                        # La descripción, que puede estar en varias líneas

                                        $description .= ' '  if($description ne '');
                                        $description .= $1;
                                }
                        }

                        # Queremos que las inserciones se hagan efectivas
                        # pero sólo se debe hacer cuando no se ha producido un error
                        $dbh->commit()  unless(defined($errflag));

                        # Se cierra el fichero procesado
                        close(INFILE);
                } else {
                        warn "Imposible abrir el fichero $file.";
                }

                # Detección de error al insertar, para no seguir procesando archivos
                last  if(defined($errflag));
        }

        # Por último, se cierra la conexión a la base de datos
        $dbh->disconnect();
} else {
        die "Debes introducir al menos un parámetro.";
}


al ejecutar en el terminal perl swentry.pl sw-ejemplo.sw me da el siguiente fallo:
install_driver(mysql) failed: Can't locate loadable object for module DBD::mysql
in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at (eval 4) line 3
Compilation failed in require at (eval 4) line 3.
Perhaps a module that DBD::mysql requires hasn't been fully installed
at swinsert.pl line 29

creo que es porque no tengo instalado DBD:mysql, pero no se como se hace, por favor, necesito ayuda.

muchas gracias.
Mensaje Mar Jun 13, 2006 7:17 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Quita la línea que pone 'package DBD::mysql;' y prueba...
Mensaje Mar Jun 13, 2006 7:20 am
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Responder citando

nada, el mismo fallo
Mensaje Mar Jun 13, 2006 7:45 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

Como dice explorer, quita la línea que dice:

Código:
package DBD::mysql;


Ahora, por el error que te pone parece que o no tienes instalado el módulo DBD::MySQL o la instalación está corrupta.

Saludos
Mensaje Mar Jun 13, 2006 7:59 am
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Responder citando

muchas gracias, pero necesito saber como se instala bien, porque he probado de mil formas Embarassed Embarassed Embarassed
Mensaje Mar Jun 13, 2006 8:25 am
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Responder citando

otra cosa, para instalarme DBI::MYSQL hago lo siguiente:

c:\> ppm
ppm>install DBI
note: package 'DBI' is already installed
ppm>install DBI::mysql
Error: no valid repositories: Error: 503 Service Unavailable

¿¿¿¿como se soluciona este error???????
Mensaje Mar Jun 13, 2006 10:45 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

El error dice que no se puede conectar a activestate.com para bajarse el módulo.

¿Tienes conexión a Internet? Prueba a entrar en www.activestate.com para ver si puedes conectarte a ellos.
Es posible que estés detrás de un proxy/firewall y te esté filtrando el acceso...
Es posible también que se haya estropeado la configuración del ppm y se esté intentando conectarse a una dirección errónea (un poco raro, la verdad). Si es así, lo mejor es o buscar el fichero de configuración o reinstalar el activestate entero (lo cual es más normal bajarse una nueva versión).
Mensaje Mar Jun 13, 2006 6:50 pm
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Responder citando

muchas gracias por todo, ya he conseguido solucionarlo cambiando la version de activeperl, y me funciona muy bien ahora. Dios, que descanso, menos mal. Very Happy Very Happy Very Happy

pero como siempre siguen surgiendo dudillas.
resulta que la base de datos está en mysql, que lee las fechas en formato aaaa-mm-dd, pero yo estoy intentando introducir datos (muchíiiisimos datos) en una tabla en mysql, y resulta que esos datos tienen las fechas en formato dd-mm-aaaa.

me gustaria que alguien me dijera alguna forma para cambiar el formato antes de introducirlo en mysql.
Código:
 elsif($line =~ /^DT   (\d{4}-\d{2}-\d{2}).+annotation update/) {
                                        # Fecha de la última actualización

                                        $lastdate = $1;


muchisimas gracias, de todas formas, yo seguiré intentandolo.
Mensaje Mar Jun 13, 2006 7:42 pm
DETA
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Abr 2006
Mensajes: 9
Responder citando

aqui estoy de nuevo, resulta que lo de antes ya lo he solucionado, mas o menos, con el siguiente codigo:
Código:

use strict;
 use MySQL::DateFormat;

 my $md = MySQL::DateFormat->new(format => 'eu');
 my $fecha = "01-10-1989";
 #$md->toMySQL("$fecha");
 print $md->toMySQL("$fecha");


hasta aqui bien, pero otros archivos la fecha me viene en formato mas dificil todavia:
01-OCT-2003
y esto si que no sé como se pondría en formato:
2003-10-01

bueno, yo ya me voy a dormir Shocked y mañana veremos si estoy mas fresca y lo soluciono. si alguien encuentra la solucion antes que yo que me lo diga, por favor, porque ya no puedo mas.

Sad Sad Sad
Mensaje Jue Jun 15, 2006 9:58 am
quakegod
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Jun 2006
Mensajes: 1
Responder citando

Amigos, saludos cordiales, pregunta estoy haciendo un script perl para ejecutarse en MySQL, para que haga un select a una base de datos y el resultado de dicho select lo guarde en una variable que despues utilizaré en un insert hasta ahora voy en esto:
Código:
#usr/bin/perl -w
package DBD::mysql;
use DBI;
use strict;

use DBI;

$dbh = DBI->connect('DBI:mysql:$dbname:$dbhost',$dbuser,$dbpass);
$dbh->do(SELECT dato FROM tabla);
$query = $dbh->prepare( SELECT dato FROM tabla );
$query->execute();
my($max)= fetch($dbh);

Mi pregunta es, como guardo o asocio el resultado de esa consulta a una variable (my$row1) y como puedo utilizarla en otro query?? en php puedo definir facilmente las variables, y guardar los resultados de cualquier query, pero en perl realmente es un poco complicado.

Gracias por su ayuda!!!
Mensaje Jue Jun 15, 2006 5:01 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola quakegod:

Bienvenido al foro, ahora, acerca de tu pregunta, es sumamente sencillo conectarse a un database por medio de Perl, y usando el módulo DBI la cosa es realmente fácil, por ejemplo:

Código:

#!/usr/bin/perl -w

use strict;
use DBI;


my $dbh = db_connect();

   my $sth = $dbh->prepare('SELECT dato FROM tabla LIMIT 1') or die("Couldn't prepare statement: " . $dbh->errstr);
   $sth->execute() or die("Couldn't execute statement: " . $sth->errstr);
   my $dato = $sth->fetchrow_array();
   $sth->finish;


   $sth = $dbh->prepare('INSERT INTO otra_tabla SET dato=?') or die("Couldn't prepare statement: " . $dbh->errstr);
   $sth->execute($dato) or die("Couldn't execute statement: " . $sth->errstr);
   $sth->finish;

$dbh->disconnect;



sub db_connect{

my $db_user = "username";
my $db_pass = "pass";

my $host_name = "localhost";
my $db_name = "DATABASE";

my $q_string = "DBI:mysql:host=$host_name;database=$db_name";


        return (DBI->connect ($q_string, $db_user, $db_pass,
                                                        {PrintError => 1, RaiseError => 1}))  ;

}



Este script lo que hace es conectarse al database, leer una primera tabla en donde recibe un dato que guardamos en la variable $dato, después usando el valor que acabamos de tomar lo vamos a insertar en una segunda tabla.

Como ves es realmente sencillo, solamente falta tomarle la onda al módulo DBI. Aquí en el sitio hay un tutorial que habla acerca de esto:
http://perlenespanol.baboonsoftware.com/archives-tut/000045.html

Y claro que también puedes ver la documentación del módulo DBI:
http://search.cpan.org/search?query=DBI&mode=all


Saludos
Mensaje Mie Jul 19, 2006 6:22 am
tuxer
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Jul 2006
Mensajes: 2
Responder citando

He intentado ejectutar tu código para conectar a una bbdd mysql atraves de perl y me ha dado este error, lo he intentado con otros codigos y me pasa lo mismo.

Alguna ayudita??

Código:
[root@WebServer1 perl]# perl llenarparciales2.pl
Driver has not implemented the disconnect_all method. at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/DBI.pm line 565
END failed--call queue aborted.
Mensaje Mie Jul 19, 2006 9:15 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Pues el error dice que DBD::mysql no tiene ese método. Prueba a actualizarlo, a ver qué pasa...
Mensaje Jue Jul 20, 2006 12:43 am
tuxer
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Jul 2006
Mensajes: 2
Responder citando

Genial, me lo baje y lo compile por q el cpan no me tira ( no tengo internet en esa maquina ).

Gracias
Mensaje Mie Abr 11, 2007 7:46 pm
ficovh
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Abr 2007
Mensajes: 1
Re: Conectar a MySQL Responder citando

¿Qué sistema Operativo usas? En Windows usa el ppm (perl package manager)

En BSD/Linux o Variantes hay una forma via, CPAN.

$ perl -MCPAN -e 'install DBD::MySQL'

Otra forma de hacerlo es descargando de CPAN el módulo e instalandolo manualmente:

http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.004.tar.gz

de igual forma en Unix, se instala así:

$ perl Makefile.PL
$ make
# make install (como root)

De cualquier forma, cualquiera que sea tu necesidad, no dudes en seguir preguntando.

Wink
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group