• Publicidad

Acceder a base de datos MySQL desde script en Perl

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

Acceder a base de datos MySQL desde script en Perl

Notapor jacks » 2011-12-01 08:47 @407

¡Hola! Tengo una pequeña duda. He creado un programa en Perl que necesita conectarse a MySQL. Todo funciona correctamente porque está usando la base de datos de mi ordenador y mi clave. El problema que veo yo cuando lo instale otra persona en su ordenador, y lógicamente, no tendrá la misma clave que yo, ¿habría alguna manera de hacer que funcionase en cualquier PC? Es que no se me ocurre nada. Lo único la persona que lo use deberá crearse una cuenta con el nombre root y el pasword que utilizo, ¿no? De esta manera será todo igual.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Publicidad

Re: Acceder a base de datos MySQL desde script en Perl

Notapor explorer » 2011-12-01 11:49 @534

La solución sería que el programa instalador, a la hora de crear el esquema en la MySQL, definiese también un usuario para acceder a ella, que coincidiese con la que use el programa. O dar también la oportunidad de preguntar al usuario si tiene ya creado un usuario, y en ese caso, preguntarle por sus credenciales, y grabarlas luego en el programa, para que haga uso de ellas.

Para el primer caso, el programa instalador necesitará saber las credenciales de acceso a la MySQL, algo que puede saber si lo pregunta al usuario que instaló la MySQL, o lo sabe el propio instalador, si fue él el que también instaló la MySQL.

Una vez que tenga acceso completo a la MySQL, crea el esquema de la base de datos y un usuario genérico para acceder a ella.
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

Re: Acceder a base de datos MySQL desde script en Perl

Notapor pvaldes » 2011-12-02 19:16 @844

> ¿habría alguna manera de hacer que funcionase en cualquier PC?

Sí, usa un montón de argumentos para lanzar el programa
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Acceder a base de datos MySQL desde script en Perl

Notapor jacks » 2011-12-06 06:42 @320

Vale, ya he creado el método para que el usuario pueda meter el usuario y el pasword. Pero el problema es ¿cómo compruebo que esos son los datos correctos?

Lo probé con:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

pero después me di cuenta que si la base de datos que tengo puesta en q_string no existe, aunque los datos sean correctos, dará error. :?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Acceder a base de datos MySQL desde script en Perl

Notapor explorer » 2011-12-06 07:34 @357

(Te sobran los paréntesis más externos.)

Si no se ha podido conectar, $DBI::errstr y $DBI::err tendrán almacenados el mensaje y número de error que ha ocurrido.

Como tienes puesta la opción PrintError => 0, el mensaje no saldrá al STDERR, así que no sabrás qué ha ocurrido. Por eso tienes que analizarlo desde el propio programa (no queremos que el usuario vea el error original en inglés, y/o que el programa lo gestione por sí mismo).

Pero el problema lo tienes en RaiseError => 1, ya que con eso estás indicando que si ocurre un error, se muera el programa (y mostrando el error en STDERR).

Si no quieres que el usuario vea ningún error, deberás ponerlo a '0'.

Y... ¿cuál es el mensaje de error? Depende del motor de bases de datos que estemos usando. Si es MySQL, saldrá algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
root@hs-981:~/# perl -MDBI -E 'DBI->connect("DBI:mysql:database=kkk", "user", "pass", {PrintError => 0, RaiseError => 0}); say "[$DBI::err][$DBI::errstr]"'
[1045][Acceso negado para usuario: 'user'@'localhost' (Usando clave: SI)]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

También saldrá el mismo mensaje de error si la tabla es correcta pero si el usuario (o la contraseña) están mal.

Si, en cambio, los usuarios son correctos y tienen permisos para conectarse, pero la tabla es incorrecta, saldrá este mensaje:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[1049][Base de datos desconocida 'kkk']
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

con lo que puedes usarlo para sacar un aviso en pantalla e informar al usuario.

Lista de códigos de error para MySQL (para el servidor).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($DBI::err == 1049) {
  2.     say "La base de datos no está bien indicada o no existe";
  3. }
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acceder a base de datos MySQL desde script en Perl

Notapor jacks » 2011-12-06 10:24 @475

Ya, pero creo que aun así no funcionará lo que quiero hacer.

Intentaré explicarme mejor. Imagina que no hay ninguna base de datos creada con lo cual lo que quiero que haga es que al introducir el usuario y la contraseña la cree.

Por ejemplo, database= "prueba" usuario= "jacks" password = "pwd".

Lo que quiero que haga, como es la primera vez que ejecuto el programa, es que cree la base de datos con el nombre y clave que he introducido. Si las clave y la contraseña no coinciden no se crea y da error. En cambio, si es correcto, que la cree.

¿Se podría hacer con este código? Lo que pasa que no sé cómo hacer que dé el error.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ($db) = @_;                         # Recoge los datos pasadosdesde la  llamada en estas variables
  2.  
  3. my @databases = DBI->data_sources( "mysql", { host => 'localhost', user => $usu, password => $pwd } );
  4.                                        # Cogemos la lista de bases de datos presentes en el sistema
  5.  
  6. my $base_datos = $db;                  #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos
  7.  
  8. my $dsn = "DBI:mysql:$base_datos";     # Conformamos el DSN de esa base de datos
  9.  
  10. unless ( $dsn ~~ @databases ) {        # Si el $dsn no está entre las @databases la creamos
  11.  
  12.     my $drh = DBI->install_driver("mysql");    # Carga del controlador mysql
  13.  
  14.     my $rc = $drh->func( "createdb", $base_datos, 'localhost', $usu, $pwd, 'admin' );    # Creamos la base de datos
  15. }
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-12-06 14:18 @637, editado 2 veces en total
Razón: Formateado de código con Perltidy
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Acceder a base de datos MySQL desde script en Perl

Notapor explorer » 2011-12-06 17:04 @753

Pero para poder crear una nueva base de datos, se debe hacer con un usuario/contraseña que tenga permisos para poder hacer eso (el usuario administrador, por ejemplo). Un usuario normal no puede hacerlo, salvo que tenga concedidos los permisos para CREATE (crear tablas y bases de datos).

Entonces... desde el principio, ese usuario debe tener todos los permisos (todos, excepto GRANT y alguno más, que no son necesarios). Teniendo concedido el de CREATE, podrá ejecutar comandos SQL de creación de bases de datos, y luego, de las tablas.

Algo así (antes tiene que existir el usuario, claro, y con permisos de CREATE puestos por el administrador)
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. CREATE DATABASE basedatos;                                        # Crear la base de datos
  2. GRANT ALL privileges ON basedatos.* TO user@localhost;            # privilegios: todos, para ese usuario, a esa base
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acceder a base de datos MySQL desde script en Perl

Notapor jacks » 2011-12-07 08:53 @411

Hummm... sí, vale, pero es que el usuario y la contraseña estarán creados al instalar la base de datos MySQL con lo cual ya tendrá los permisos. Lo único que quiero es que me compruebe que con esos datos (usuario y contraseña) puedo crear bases de datos. Que pueda lanzar un error diciendo que no puede acceder o no se puede crear una base de datos con ese usuario y esa contraseña. No sé si me expliqué bien ahora. Yo no quiero dar permisos a nadie, solo quiero que el usuario meta sus datos y pueda o no crear bases de datos dependiendo si son correctos o no los datos.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Acceder a base de datos MySQL desde script en Perl

Notapor explorer » 2011-12-07 11:31 @521

Pues entonces lo tienes hecho: el usuario dice qué usuario y contraseña quiere usar.

Tú pruebas el acceso.

Si DBI devuelve un error, pues se lo dices al usuario...
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

Re: Acceder a base de datos MySQL desde script en Perl

Notapor pvaldes » 2011-12-08 14:08 @631

jacks escribiste:Hummm... sí, vale, pero es que el usuario y la contraseña estarán creados al instalar la base de datos MySQL con lo cual ya tendrá los permisos. Lo único que quiero es que me compruebe que con esos datos (usuario y contraseña) puedo crear bases de datos. Que pueda lanzar un error diciendo que no puede acceder o no se puede crear una base de datos con ese usuario y esa contraseña. No sé si me expliqué bien ahora. Yo no quiero dar permisos a nadie, solo quiero que el usuario meta sus datos y pueda o no crear bases de datos dependiendo si son correctos o no los datos.


vaya lío que tienes...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ($db) = @_;  # Recoge un solo valor, el primer argumento.
  2.  
  3. my @databases = DBI->data_sources( "mysql", { host => 'localhost', user => $usu, password => $pwd } );    
  4. # NO, nunca se indica el password en un archivo de texto plano
  5. # Y NO FUNCIONARÁ porque tienes que conectarte a tu base de datos ANTES de poder trabajar con ella
  6.  
  7. my $base_datos = $db;   # este paso es totalmente innecesario
  8.  
  9. my $dsn = "DBI:mysql:$db";  # de nuevo innecesario
  10.  
  11. unless ( $dsn ~~ @databases ) {  
  12.  
  13.   my $drh = DBI->install_driver("mysql");    # este paso debería ser innecesario,
  14.                                              # mysql viene por defecto
  15.                                              # además $drh aún no existe
  16.  
  17.   my $rc = $drh->func( "createdb", $db, 'localhost', $usu, $pwd, 'admin' );
  18.  
  19.    # no has creado un database handle nuevo, $drh no existe
  20.    # Usa DO para esto,
  21.    # Y de nuevo contraseña pasada como variable, cualquiera que quiera leer esta contraseña solo tiene que imprimir la variable y ya tiene las llaves de tu casa
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Léete la documentación.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Siguiente

Volver a Bases de datos

¿Quién está conectado?

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