Sqlite y funciones definidas por el usuario: create_function()

Sqlite ya dispone de muchas funciones incorporadas como: COUNTMAXMINAVGSUMLENGTHLOWERUPPERSUBSTRREPLACEDATEDATETIME, etc.

Pero además, se pueden crear funciones definidas por el usuario para procesar los datos obtenidos o los datos a insertar en la forma que el usuario crea conveniente.

Para crear una función definida por el usuario se usa el método create_function() de sqlite3, al cual hay que pasarle tres argumentos, el primero es el nombre que tendrá la función en la sentencia SQL, el segundo es el número de argumentos que se le pasa esta función y el tercero es el nombre de la función Python que realizará el proceso.

En el siguiente ejemplo, se construye una tabla de usuarios y contraseñas y se crea una función de Python para obtener el hash de una contraseña de SQLite. Luego se usa el método create_function() para definir una función que se pasa a sentencia SQL.

Lo primero, es importar las librerías necesarias y crear la base de datos y la tabla de usuarios con los campos id, nombre y password.

import os
import sqlite3
from hashlib import blake2b
db = os.path.join(os.getcwd(),'test.db3')
con = sqlite3.connect(db)
cur = con.cursor()
cur.execute('''
CREATE TABLE Usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nombre VARCHAR(128), password VARCHAR(128))
''')
con.commit()
con.close()

Tras esto habrá que crear una función en Python que retorne el hash de la contraseña pasada como argumento y luego aplicarle la función al objeto conectado a la base de datos. Se pasa entre comillas el nombre de la función que se escribirá en la sentencia SQL, el número de argumentos a pasar que en este caso es uno, es decir, la contraseña y el tercer argumento, que es el nombre de la función anteriormente definida en Python. 

def _encripta_password(password):
    o = blake2b()
    o.update(password.encode('utf-8'))
    return o.hexdigest()

con.create_function('encripta_password',1,_encripta_password)
cur = con.cursor()

Tras definir la función, se puede usar de la siguiente forma:

dato = ('Javier','Password')
cur.execute('''
INSERT INTO Usuarios (nombre,password) VALUES (?,encripta_password(?))''', dato)
con.commit()

Como se puede apreciar el segundo parámetro que se le pasa a la sentencia INSERT está usando la función encripta_password().

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *