dbuse

Una clase para acceder a MySQL


Keywords
MySQL, Python, clase
License
MIT
Install
pip install dbuse==1.0.0

Documentation

python_DBAccess

DBAccess es una clase basada en mysql_connector pensada para acceder a bases de datos MySQL. Permite definir una conexión, un cursor, y ejecutar consultas, tanto de lectura como de inserción, actualización o eliminación de datos. También permite destruir un cursor creado, cuando ya no lo vayamos a necesitar más, bien por haber terminado nuestra actividad, o por tener que crear otro, para operar sobre otra base de datos.

Uso básico de la clase DBAccess

Para utilizar esta clase en un proyecto se recomienda crear un entorno virtual:

python -m venv bds

En esta línea, bds es el nombre que le daremos al proyecto. Por buenas prácticas, se aconseja que coincida con el nombre del directorio donde lo alojaremos.

Una vez creado el entorno virtual lo activaremos. Si estamos en MacOS o Linux usremos:

source bds/bin/activate

Si estamos trabajando en un entorno Windows usaremos:

bds\Scripts\activate.bat

Si en algún momento debemos salir del entorno virtual, simplemente lo desactivaremos con:

deactivate

A continuación instalaremos todas las dependencias del proyento en nuestro entorno virtual:

pip install -r requirements.txt

Crearemos un archivo main.py para poder usar la clase DBAccess. En la primera línea teclearemos:

from database import DBAccess

Esto nos permite importar la clase en nuestra aplicación.

A continuación tenemos que instanciar la clase en un objeto al que llamaremos, por ejemplo, bases. La forma más simple de hacerlo es la siguiente:

bases = DBAccess()

Esto crea un objeto con los siguientes parámetros por defecto:

host = "localhost"
user = "root"
password = ""

Si nuestros datos de conexión a MySQL son diferentes podemos especificarlos en el constructor:

bases = DBAccess(host="my_host", user = "my_user", password = "my_password")

Todos los parámetros son opcionales, si alguno de ellos nos vale con el valor por defecto, y deben especificarse nominalmente, como en el ejemplo.

El siguiente paso es crear una conexión a MySQL, y un cursor. Lo haremos así:

bases.create_connection()
bases.create_cursor()

A continuación podemos ver las bases de datos que tenemos disponibles, así:

bases.show_databases()

Para trabajar con una base de datos específica tenemos que activarla, así:

bases.select_database("my_database")

Si la base de datos existe, se activará. Si no existe, se crea automáticamente, y se activa.

A continuación podemos ver las tablas existentes en la base de datos activa, así:

tablas = bases.get_tables()
print(tablas)

Obviamente, si la base de datos es de nueva creación obtendremos una lista vacía. En caso contrario obtendremos una lista de las tablas que esxisten en la base de datos.

Si lo deseamos podemos crear una nueva tabla. Por ejemplo, usaremos la siguiente consulta:

query = """
CREATE TABLE my_people (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    dni VARCHAR(20) UNIQUE,
    name VARCHAR(150),
    email VARCHAR(100),
    birth_date DATE,
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL  
);
"""
bases.set_data(query)

Mediante el método set_data() podremos efecctuar cualquier consulta que modifique el contenido de una tabla de la base de datos, o de la base de datos en sí. Esto se refiere a consultas de inserción, actualizacón o eliminación. Por ejemplo, si queremos eliminar un registro específico de la tabla my_people haremos algo así:

query = "DELETE FROM my_people WHERE dni = '12345678A'"
bases.set_data(query)

Si el registro existe será eliminado. Si no existe, simplemente no se efectuarán cambios en la tabla.

Si queremos efectuar consultas de selección, es decir, de recuperación de datos, usaremos el método get_data(). Un ejemplo de uso sería el siguiente:

query = "SELECT * FROM my_people WHERE dni = '12345678A'"
usuario = bases.get_data(query)

Si el registro existe sus datos entrarán en la variable usuario. En caso contrario, esta variable quedará vacía.

##Otras operaciones## Además del uso básico de esta clase, que hemos comentado, tenemos disponibles otras operaciones.

Para ver los permisos del usuario actual, usaremos el método show_user_grants(), así:

permisos = bases.show_user_grants()
print(permisos)

Para destruir el cursor que estamos empleando usaremos el método close(), como vemos a continuación:

bases.close()

##Consultas preparadas## Esta clase no sería realmente útil si no pudiera ejecutar consultas preparadas para evitar la inyección SQL. Los métodos get_data() y set_data() aceptan un parámetro opcional llamado params. Podemos construir una consulta preparada de escritura, por ejemplo, así:

query = "UPDATE my_people SET name = %s WHERE dni = %s"
params = ("John", "12345678A")
bases.set_data(query, params)

Como se ve, params es una tupla con los parámetros necesarios para ejecutar la consulta.

En el caso de consultas de recuperación de datos (lectura) debemos usar el método get_data() así:

query = "SELECT * FROM my_people WHERE dni = %s"
params = ("12345678A",)
result = bases.get_data(query, params)[0][0]

Observa que si sólo hay un parámetro, debemos poner una coma después del mismo, para que la tupla sea reconocida como tal. También debes poner atención a los dos índices que hay después del método get_data() para recuperar los datos leidos. Si la condición de la claúsula WHERE no se cumple y, por lo tanto, no se obtienen datos de retorno la variable result valdrá 0.