Mar Jun 13, 2006 7:10 am
|
 |
DETA
Perlero Nuevo

|
Registrado: 06 Abr 2006
Mensajes: 9
|
|
| Conectar a MySQL |
|
|
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. |
|
|
|

Mar Jun 13, 2006 7:17 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
| Quita la línea que pone 'package DBD::mysql;' y prueba... |
|
Mar Jun 13, 2006 7:20 am
|
 |
DETA
Perlero Nuevo

|
Registrado: 06 Abr 2006
Mensajes: 9
|
|
|
|
|
| nada, el mismo fallo |
|
Mar Jun 13, 2006 7:45 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Mar Jun 13, 2006 7:59 am
|
 |
DETA
Perlero Nuevo

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

|
Registrado: 06 Abr 2006
Mensajes: 9
|
|
|
|
|
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??????? |
|

Mar Jun 13, 2006 10:45 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
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). |
|

Mar Jun 13, 2006 6:50 pm
|
 |
DETA
Perlero Nuevo

|
Registrado: 06 Abr 2006
Mensajes: 9
|
|
|
|
|
muchas gracias por todo, ya he conseguido solucionarlo cambiando la version de activeperl, y me funciona muy bien ahora. Dios, que descanso, menos mal.
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. |
|

Mar Jun 13, 2006 7:42 pm
|
 |
DETA
Perlero Nuevo

|
Registrado: 06 Abr 2006
Mensajes: 9
|
|
|
|
|
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 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.
 |
|

Jue Jun 15, 2006 9:58 am
|
 |
quakegod
Perlero Nuevo

|
Registrado: 15 Jun 2006
Mensajes: 1
|
|
|
|
|
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!!! |
|

Jue Jun 15, 2006 5:01 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|

Mie Jul 19, 2006 6:22 am
|
 |
tuxer
Perlero Nuevo

|
Registrado: 19 Jul 2006
Mensajes: 2
|
|
|
|
|
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.
|
|
|
Mie Jul 19, 2006 9:15 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
| Pues el error dice que DBD::mysql no tiene ese método. Prueba a actualizarlo, a ver qué pasa... |
|
Jue Jul 20, 2006 12:43 am
|
 |
tuxer
Perlero Nuevo

|
Registrado: 19 Jul 2006
Mensajes: 2
|
|
|
|
|
Genial, me lo baje y lo compile por q el cpan no me tira ( no tengo internet en esa maquina ).
Gracias |
|
Mie Abr 11, 2007 7:46 pm
|
 |
ficovh
Perlero Nuevo

|
Registrado: 11 Abr 2007
Mensajes: 1
|
|
| Re: Conectar a MySQL |
|
|
¿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.
 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|