Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Bases de Datos » Acceder a base de datos MySQL desde script en Perl Responder al tema
Nuevo tema


Página 1 de 1  [ 13 mensajes ] 
 
Nota 2011-12-01 08:47 @407

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Acceder a base de datos MySQL desde script en Perl
¡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.


Nota 2011-12-01 11:49 @534
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a base de datos MySQL desde script en Perl
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


Nota 2011-12-02 19:16 @844

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Acceder a base de datos MySQL desde script en Perl
> ¿habría alguna manera de hacer que funcionase en cualquier PC?

Sí, usa un montón de argumentos para lanzar el programa


Nota 2011-12-06 06:42 @320

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Acceder a base de datos MySQL desde script en Perl
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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));

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. :?


Nota 2011-12-06 07:34 @357
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a base de datos MySQL desde script en Perl
(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:
Syntax: [ Download ] [ Hide ]
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)]

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:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
[1049][Base de datos desconocida 'kkk']

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).

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. if ($DBI::err == 1049) {
  2.     say "La base de datos no está bien indicada o no existe";
  3. }

_________________
JF^D Perl programming


Nota 2011-12-06 10:24 @475

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Acceder a base de datos MySQL desde script en Perl
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.

Syntax: [ Download ] [ Hide ]
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.  


Última edición por explorer el 2011-12-06 14:18 @637, editado 2 veces en total
Formateado de código con Perltidy


Nota 2011-12-06 17:04 @753
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a base de datos MySQL desde script en Perl
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)
Syntax: [ Download ] [ Hide ]
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

_________________
JF^D Perl programming


Nota 2011-12-07 08:53 @411

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Acceder a base de datos MySQL desde script en Perl
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.


Nota 2011-12-07 11:31 @521
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a base de datos MySQL desde script en Perl
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


Nota 2011-12-08 14:08 @631

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Acceder a base de datos MySQL desde script en Perl
jacks escribió:
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...

Syntax: [ Download ] [ Hide ]
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


Léete la documentación.


Nota 2011-12-08 16:41 @736
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a base de datos MySQL desde script en Perl
A ver, pvaldes... que me parece que te has colado otra vez...

El código que está usando jacks está sacado de aquí, donde comentaba con Txemaracas diversas formas, la más óptimas posibles, para crear bases de datos en una MySQL, a petición de un usuario, en el caso de que la base de datos no exista.

Se puede hacer de varias maneras, como se comenta en ese hilo. Esta es una en la que se dialoga con el motor MySQL de forma directa (no usando las funciones básicas de DBI. Idea sacada de la propia página de manual DBD::mysql).

La línea 13 le pide a DBI que nos dé un manejador para poder dialogar con la biblioteca MySQL. NO estamos instalando nada, sino que estamos pidiendo a DBI que cargue el controlador de MySQL para poder dialogar con el motor. (Tampoco tiene sentido decir "debería": DBI no sabe con qué motor de base de datos queremos dialogar. En un sistema puede haber varios motores simultáneos).

La línea 17 le solicita al controlador de MySQL que cree una nueva base de datos, y que nos dé el resultado de la operación.

Lo que comentas de que $drh no existe, ¿a qué te refieres? Es una variable escalar que salta a la existencia en la misma línea 13 (la estamos declarando y definiendo).

Y sobre el tema de las contraseñas, que te conteste jacks. Por mí, yo no veo problemas.

_________________
JF^D Perl programming


Nota 2011-12-09 11:04 @502

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Acceder a base de datos MySQL desde script en Perl
hombre, si hablamos de un código incompleto ya no opino, desde luego tal y como estaba planteado ahí nunca funcionaría... el del enlace que pones probablemente sí lo haga.

> # USADO para esto,

veo que se ha corregido, pero no, debe decir lo que ponía inicialmente, lo entrecomillo para que no quede ambiguo

USA "DO" para esto


Nota 2011-12-14 07:03 @336

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Acceder a base de datos MySQL desde script en Perl
Hola pvaldes. Yo no soy un experto en base de datos. De hecho sé poco sobre ese tema. Por eso quizás mis ideas o mis códigos te puedan parecer ridículos o muy poco eficaces.

He estado mirando la documentación de DBD::mysql y no he encontrado lo que quería, quizás puedas ayudarme.

Mi intención es que el programa que he hecho, cree un usuario con una contraseña. La primera vez que se ejecute el programa no existirá ese usuario con lo cual lo creará pero a partir de ese momento se conectará directamente cada vez que se ejecute.

El problema es que no sé como darle los privilegios al usuario que he creado parapoder crear bases de datos.


Responder al tema  [ 13 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO