• Publicidad

Conectar a MySQL

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Conectar a MySQL

Notapor DETA » 2006-06-13 08:10 @382

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: Seleccionar todo
#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.
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Publicidad

Notapor explorer » 2006-06-13 08:17 @386

Quita la línea que pone 'package DBD::mysql;' y prueba...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor DETA » 2006-06-13 08:20 @389

nada, el mismo fallo
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Notapor kidd » 2006-06-13 08:45 @406

Hola:

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

Código: Seleccionar todo
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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor DETA » 2006-06-13 08:59 @416

muchas gracias, pero necesito saber como se instala bien, porque he probado de mil formas :oops: :oops: :oops:
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Notapor DETA » 2006-06-13 09:25 @434

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???????
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Notapor explorer » 2006-06-13 11:45 @531

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 http://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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor DETA » 2006-06-13 19:50 @868

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

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: Seleccionar todo
 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.
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Notapor DETA » 2006-06-13 20:42 @904

aqui estoy de nuevo, resulta que lo de antes ya lo he solucionado, mas o menos, con el siguiente codigo:
Código: Seleccionar todo
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 :shock: 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.

:( :( :(
DETA
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-04-06 05:13 @259

Notapor quakegod » 2006-06-15 10:58 @499

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: Seleccionar todo
#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!!!
quakegod
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2006-06-15 09:42 @446

Siguiente

Volver a Bases de datos

¿Quién está conectado?

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