lunes, 23 de abril de 2018

Librerías para manejar bases de datos en Python


Existen varias maneras de conectar Python con un servidor MySQL, Después de haber investigado algo más, y de probar yo mismo desde la consola con Python, me decantaré por las dos maneras más usuales: MySQLdb y mysql connector.



Únicamente como datos informativos, diré que MySQLdb es un módulo de C que enlaza con la librería libmysqlclient, es muy rápido, pero requiere esta librería para funcionar. De hecho, en mi caso, que uso Debian, esta librería debe ser instalada manualmente:
sudo apt-get install python-mysqldb
Por el contrario, mysql-connector es un módulo de Python que reimplementa el protocolo MySQL. Es algo más lento, pero al no precisar librerías C, es independiente del sistema operativo, por lo que es más portable.
En Charles Nagy hacen una comparativa de velocidad entre los dos métodos. La diferencia de velocidad, cuando se usa para aplicaciones pequeñas, es muy pequeña, y para el uso local, que es el que le voy a dar, la diferencia es inapreciable. Además, no necesito portar los scripts que genere, por lo que me decanto por MySQLdb.
--------------------------------------------------------------------------------------------------------------------------

Mucha gente usa Python debido a que como otros lenguajes de script, es portable, independiente de la plataforma y usa un lenguaje de propósito general que puede realizar todo tipo de tareas, incluso las que hacen referencias a Bases de Datos. Python te permite escribir programas que accedan, muestren y actualicen la información en la Base de Datos con un esfuerzo mínimo.

Para realizar esto, se creo en Python un API para accesos a bases de datos que actualmente se encuentra en su versión 2.0

Lo primero que uno tiene que hacer es conseguirse la librería que te va a permitir trabajar con tu Base de Datos preferida. Si escoges SQLite, MySQL, PostgreSQL o Interbase/Firebird la forma de importar sus librerías sería:




import MySQLdb # para o MySQL

import sqlite # para o SQLite

from pyPgSQL import PgSQL # para o PostgreSQL

import kinterbasdb # para Interbase / Firebird

--------------------------------------------------------------------------------------------------------------------------

Debes instalar el driver para MySQL antes de hacer cualquier cosa. A diferencia de PHP, solo el driver para SQLite viene instalado por defecto en Python. El paquete mas usado para hacerlo es MySQLdb pero es un poco difícil de instalar usando easy_install.
Para usuarios de Windows, pueden descargar un exe de MySQLdb.
Para Linux, es un paquete casual (python-mysqldb). Puedes usar en la línea de comandos sudo apt-get install python-mysqldb para distribuciones basadas en Debian o yum install mysql-python para distribuciones basadas en RPM.
Después de la instalación, reinicia el sistema. Esto no es obligatorio.
Un uso más avanzado:
Una vez que sepas como funciona, puedes usar un ORM para evitar escribir sentencias SQL manualmente y manipular las tablas como si fueran objetos de Python. El ORM mas famoso en la comunidad Python es SQLAlchemy.
Realmente te recomiendo usarlo: tu vida será mucho más fácil.
Recientemente descubrí otra joya en el mundo de Python: peewee. Es un ORM bastante ligero, realmente sencillo y rápido de configurar y usar. Me ayudó mucho en pequeños proyectos o aplicaciones stand alone, donde el uso de grandes herramientas como SQLAlchemy y Django puede ser excesiva:
import peewee
from peewee import *

db = MySQLDatabase('jonhydb', user='john',passwd='megajonhy')

class Book(peewee.Model):
    author = peewee.CharField()
    title = peewee.TextField()

    class Meta:
        database = db

Book.create_table()
book = Book(author="me", title='Peewee is cool')
book.save()
for book in Book.filter(author="me"):
    print book.title

Peewee is cool 
Este ejemplo funciona como ejemplo de usabilidad. Nada mas que tener instalado peewee(pip install peewee :-)) es requerido. Sin configuraciones complicadas. Es excelente. 

---------------------------------------------------------------------------------------------------------------

Si estás usando una versión actual de Python, la alternativa es usar mysqlclient el cual es un fork de MySQLdb1 y con soporte para Python 2.7 y >3.3.
Instalación:
Desde la línea de comandos:
$ pip install mysqlclient
Ejemplos:
import MySQLdb

db = MySQLdb.connect(passwd="moonpie",db="thangs")
c = db.cursor()
max_price = 5
c.execute("""
    SELECT spam, eggs, sausage 
    FROM breakfast
    WHERE price < %s
""", (max_price,))
# no hay que olvidarse de liberar el cursor y la conexión para evitar fugas de memoria
c.close()
db.close()
Otra forma más pythónica de realizar la conexión es mediante el with statement, que se encarga de asegurar que la conexión sea correctamente liberada:
import MySQLdb

max_price = 5
with MySQLdb.connect(passwd="moonpie",db="thangs") as conexion:
    consulta_sql = "SELECT spam, eggs, sausage FROM breakfast WHERE price < %s"
    parametros = (max_price,)
    cursor = conexion.execute(consulta_sql, parametros)
    for registro in cursor:
        print(registro)

No hay comentarios:

Publicar un comentario