MySQLdb es una interfaz que  permite conectar con bases de datos mySQL desde Python, sin embargo, a veces es preferible simplificar nuestro código contruyendo una clase a medida sobre MySQLdb.

MySQLdb

La página oficial de MySQLdb describe su API y el mapa de funciones que la componen.

Instalación

Hacemos update y upgrade del sistema e instalamos python-mysqldb:

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install python-mysqldb

Prueba

Antes de continuar, verificamos el funcionamiento y la conexión a la BD con el siguiente código de ejemplo.

Cambiad los parámetros de conexión por los de vuestra Base de Datos.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 01 13:31:01 2018
@author: altaruru
"""
#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect('localhost','usrtest','pwdtest','testDB')
cursor = db.cursor() # crea cursor
cursor.execute("SELECT VERSION()") # ejecuta sentencia SQL
data = cursor.fetchone() # recupera primer registro
print(data)
db.close() #desconecta

El resultado será similar al siguiente:

runfile('/home/altaruru/Documentos/src/pysrc/testMySQLdb.py', wdir='/home/altaruru/Documentos/src/pysrc')
('5.7.23-0ubuntu0.18.04.1',)

 

Nuestra clase, mysqlbase

En función de los requisitos de cada desarrollo suelo añadir nuevas funciones, así dispongo dentro de una sola clase de todas las funciones de comunicación y gestión de la base de datos específicas para cada proyecto.

Vamos a crear una clase es sencilla, con un conjunto mínimo de funciones. Las principales, Conectar, Ejecutar y Cerrar:

  • Connect, conexión a la BD.
    • Parámetros:
      • Host del servidor MySQL
      • Usuario de Base de Datos
      • Contraseña
      • Nombre de la Base de Datos que vamos a utilizar
      • Puerto donde está «escuchando» el servidor MySQL, por defecto 3306
    • Retorno
      • Devuelve true o false
    • Establece la codificación utf8 para el uso de ñ y acentos.
  • Exec, ejecuta sentencias SQL
    • Parámetros
      • Sentencia SQL
      • Boolean que indica si devuelve datos o no.
    • Retorno
      • Devuelve dos valores:
        • El resultado de la ejecución de la sentencia: true o false
        • Si se pasa previamente como parámetro true, devuelve el resultado de la ejecución. Si es una lista de registros el resultado es una tupla.
  • Close, cierra la conexión a BD
    • No tiene parámetros.

Tenemos otras tres funciones de consulta del estado de la conexión y resultado de operaciones:

  • getState()
    • Devuelve 1 si está establecida la conexión y 0 en caso contrario.
  • getError()
    • Si se ha producido un error en alguna operación, esta función devuelve la descripción del mismo.
  • getCount()
    • Devuelve el número de registros, Count, de la última consulta realizada.

Código de la clase

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Modified on Sun Aug 12 15:13:18 2018
@author: altaruru
"""

import MySQLdb

class mysqlbase(object):    
    def __init__(self):
        print("init()")
        self.error=""
        self.status=0
    
    def Connect(self, strhost, struser, strpasswd, strdb, nport=3306):
        try:
            # "set names utf8" permite el uso de ñ y acentos correctamente
            self.db = MySQLdb.connect(user=struser, passwd=strpasswd, host=strhost, db=strdb, port=nport, charset="utf8", init_command="set names utf8")                
            self.rs = self.db.cursor()
            self.status=1
            return True
        except Exception as e:
            self.error="Error: %s" % (e)
        except:
            self.error="Error desconocido"
        return False        
    
    def Exec(self, strsql, retrs=True):
        if self.status==1:            
            self.error=""
            try:
                print(strsql)
                self.rs.execute(strsql)
                self.db.commit()                
                if retrs:
                    result = []
                    data = self.rs.fetchone()                    
                    while (data != None):
                        result.append(data)
                        data = self.rs.fetchone()
                    # el resultado es una lista(result) de tuplas(data)
                    return True, result
                return True, None
            except Exception as e:
                self.error="Error: %s" % (e)
        return False, None
        
    def Close(self):
        self.status=0
        try:
            self.rs.close()
        except:pass
        try:
            self.cnx.close()
        except:pass
 
    def getState(self):
        return self.status;
    
    def getError(self):
        return self.error;
       
    def getCount(self):
        if self.status:
            return self.rs.rowcount
        else:
            return -1

Guardamos el archivo como mydbclass.py

Ejemplo de uso

Importamos nuestra clase y creamos variable cnn para utilizarla.

import mydbclass
cnn=mysqlbase()

Connect

Establece la conexión con la base de datos.

cnn.Connect('servidor','usuario','contraseña','basededatos')

Ejecutando sentencias.

Imaginemos que tenemos la tabla tblventas con la siguiente estructura:

'idventa', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment'
'categoria', 'varchar(20)', 'NO', '', NULL, ''
'mes', 'varchar(10)', 'NO', '', NULL, ''
'total', 'decimal(9,2) unsigned', 'NO', '', NULL, ''

Ejemplo:

En el siguiente ejemplo vemos:

  • conexión con la BD
  • ejecución sentencia insert
  • consulta
  • ejecución sentencia update
  • consulta
  • Cierre de conexión.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 20 13:31:01 2018
@author: altaruru
"""

import ncmfx.ncmdbclass

cnn=ncmfx.ncmdbclass.mysqlbase()

cnn.Connect('localhost','usrtest','usrpwd','testdb')
cnn.Exec("insert into tblventas (categoria, mes, total) values ('CATEGORIA 7', 'SEPTIEMBRE', 2377)",  False)
print(cnn.Exec("select * from tblventas",  True))
cnn.Exec("update tblventas set total=2480 where categoria='CATEGORIA 7' and mes='SEPTIEMBRE'",  True)
print(cnn.Exec("select * from tblventas",  True))
cnn.Close()

Espero haya quedado claro y sea fácil de entender.

Si alguien necesita alguna aclaración que no dude en preguntar.

 

Altaruru!

 

 

 

2 comentarios sobre «MySQL desde Python, trabajando con MySQLdb»

  1. Pedrín

    Gracias. Tenía alguna que otra duda. Resuelta!

    1. admin

      Hola Pedrín. Me alegra que te haya servido.
      Si tienes alguna duda no dudes en consultarme.

      Saludos.

Deja tu comentario