Amplía SQLite añadiendo tus propias funciones de aplicación

creando funciones sql en python

Conforme más lo uso más me gusta SQLite como gestor de bases de datos y, de un tiempo a esta parte, aparece en casi todos los proyectos que ando realizando tanto en Python como en PHP.

Ocupa poco espacio, es eficiente gestionando mis consultas y me resulta más sencillo poder utilizar SQL con los datos de mis scripts (evitando tener que recurrir a estructuras de datos más o menos farragosas).

Aunque cuenta con una colección bastante decente de funciones definidas de serie para manipular la información que incluye hasta funciones para el manejo de JSON hay ocasiones en las que se echa de menos poder realizar sobre nuestros datos alguna que otra operación (p.e un “simple” split() sobre el contenido de un campo de tipo texto).

Por fortuna existe la posibilidad de crear nuevas funciones de un modo bastante sencillo y que explicaré para el lenguaje de programación Python que es el que vengo utilizando últimamente más a menudo.

Sea el siguiente código de ejemplo completo y funcional:


#!/usr/bin/python2
# coding=UTF-8

import sqlite3

FICHERO_BD="./datos.db"

def db_funcRodeaTexto(texto):
    return "***"+texto+"***"

con = sqlite3.connect(FICHERO_BD)
con.create_function("rodea", 1, db_funcRodeaTexto)

cur=con.cursor()
sql ="select rodea(nombre) from tabla_prueba"
datos=cur.execute(sql)
for e in datos:
    print e[0]

En el que se ha definido una nueva función para SQLite (rodea) que añade 3 asteriscos por delante y por detrás del contenido del campo que se le indique (en el ejemplo el campo TABLA_PRUEBA.RODEA)

ejemplo de uso de funciones de usuario en sqlite

CONSIDERACIONES a tener en cuenta:

  1. La definición de la nueva función SQL (rodea) se realiza en las líneas [8-9] con código Python
  2. Se añade a SQLite en la línea 12 gracias a la función create_function(nombre, num_params, callback_function) donde
    1. nombre es el nombre que queremos utilizar para la función en las sentencias SQL
    2. num_params indica cuántos parámetros utiliza nuestra función. En nuestro caso, como db_funcRodeaTexto(texto) sólo tiene el parámetro texto su valor será 1
    3. callback_function es la función Python que implementa la nueva funcionalidad.

Y tú…

  • ¿Usas SQLite?
  • ¿Conocías la posibilidad de definir funciones de aplicación?
  • ¿Qué función necesitas implementar en tu proyecto? 😉

2 comentarios en “Amplía SQLite añadiendo tus propias funciones de aplicación

  1. Julio dijo:

    Es curioso, yo hubiese pensado en hacer lo siguiente

    #!/usr/bin/python2
    # coding=UTF-8

    import sqlite3

    FICHERO_BD=”./datos.db”

    def db_funcRodeaTexto(texto):
    return “***”+texto+”***”

    con = sqlite3.connect(FICHERO_BD)
    cur=con.cursor()

    sql =”select nombre from tabla_prueba”
    datos=cur.execute(sql)

    for e in datos:
    print db_funcRodeaTexto(e[0])

    y que formateara el dato python, lo que yo no sé cual de estos dos métodos será más claro y más eficiente.

    Lo que sí que me resulta curioso es que no sea persistente la función, me explico, una vez creada la función, ¿ésta no está ya para siempre en la base de datos y se puede llamar desde otro programa python?
    Por ejemplo desde este nuevo programa
    #!/usr/bin/python2
    # coding=UTF-8

    import sqlite3

    FICHERO_BD=”./datos.db”
    con = sqlite3.connect(FICHERO_BD)
    cur=con.cursor()
    sql =”select rodea(nombre) from tabla_prueba”
    datos=cur.execute(sql)
    print datos

    Gracias por compartir

    • Cuando se aplica sobre una única columna realmente no habría gran diferencia (no sería mala opción lanzar unas pruebas de rendimiento) pero entiendo que, ante la posibilidad de utilizar la función en varias de ellas, resulta más cómoda la solución planteada en el artículo ¿no te parece?

      Respecto a la persistencia, no he encontrado (no digo que no existan) en la documentación oficial, la posibilidad de definir las funciones directamente (quizás debido a que se trata de una librería y no de un SGBD) y poder reutilizarlas como bien indicas. No sería mala opción encontrar dicha posibilidad (al igual que se pueden crear procedimientos almacenados y/o vistas) en futuras versiones de SQLite.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s