Como conectar SQLAlchemy en nuestra app de flask con SQLite

En este post vemos cómo implementar el ORM SQLAlchemy en una aplicación de Flask con la base de datos SQLite, pero primero es importante entender algunos conceptos. ¿Es necesario implementar un ORM para conectar nuestra app a una base de datos? La verdad es que no; sin embargo, emplear un ORM ofrece ciertas ventajas que podemos aprovechar al momento de desarrollar cualquier aplicación en cualquier framework.

¿Por qué SQLAlchemy con Flask? Existen muchos ORM en la actualidad, pero Flask ofrece una extensión de SQLAlchemy que facilita la conexión con cualquier base de datos relacional, lo cual, si estamos empezando en el mundo del desarrollo, nos es de gran ayuda.

¿Por qué SQLite y no otra base de datos? Bien, podemos utilizar otra base de datos relacional como son MySQL o PostgreSQL; sin embargo, el uso de cada una dependerá del tamaño y las necesidades del proyecto, ya que estas ofrecen ventajas y desventajas diferentes. Ya que el objetivo en este post es crear una conexión simple con una base de datos para poner en marcha nuestra aplicación durante el proceso de prototipado, SQLite es más que suficiente para empezar nuestro desarrollo.

Nota: Más adelante podemos cambiar SQLite por otro gestor de bases de datos más potente si es necesario. Esta es una de las ventajas que nos ofrece trabajar con un ORM.

Tabla de contenidos

¿Que es un ORM?

Imagina que tienes una base de datos y quieres interactuar con ella desde tu código Python. En lugar de escribir complejas consultas SQL para cada operación (insertar, actualizar, eliminar, buscar), un ORM (Object-Relational Mapper) te permite trabajar con objetos de Python. Es como tener un traductor que convierte tus objetos en código SQL y viceversa.

Ventajas de usar un ORM:

  • Abstracción: Te permite pensar en términos de objetos y relaciones, en lugar de tablas y columnas. Esto hace que tu código sea más legible y mantenible.
  • Productividad: Al automatizar la mayor parte de la interacción con la base de datos, puedes enfocarte en la lógica de tu aplicación.
  • Independencia de la base de datos: Muchos ORMs, como SQLAlchemy, te permiten cambiar de una base de datos a otra sin modificar significativamente tu código.
  • Validación: Los ORMs suelen incluir mecanismos para validar los datos antes de guardarlos en la base de datos, lo que ayuda a prevenir errores.

¿Cómo facilita SQLAlchemy el desarrollo con Flask?

Integración sencilla: SQLAlchemy se integra fácilmente con Flask a través de extensiones como Flask-SQLAlchemy. Esto te permite definir tus modelos (clases que representan tus tablas) de forma declarativa y realizar consultas.

Mapeado de objetos a tablas: Cada clase que defines en tú código corresponde a una tabla en tu base de datos. Los atributos o propiedades de la clase se mapean a las columnas de la tabla. El ORM actúa como un traductor de código de programación a código SQL.

Código de conexión a SQLite con la extensión Flask-SQLAlchemy

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


# instanciamos nuestra app
app = Flask(__name__)

# configuramos el path de SQLite
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:////home/jdiaz/proyecto/base.db'

# instanciamos la base de datos y enlazamos con la app
db = SQLAlchemy(app)

# disponibilizamos el contexto de la app para acceder desde la terminal
app.app_context().push()

# creamos tabla de prueba para la base de datos en forma de modelo
class User(db.Model):
    #agregamos las columnas
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(50), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)

    # el método especial '__repr__' nos permite representar el objeto 
    #en forma de string, cuando se intenta imprimir o se muestra en un log
    def __repr__(self):
        return f"User('{self.username}','{self.email}')"

Explicación del código

En el contexto de los ORMs, un «modelo» se refiere a una representación en código de una tabla en una base de datos.

Importaciones: Estas líneas importan las librerías necesarias para nuestro proyecto:

  • flask: La librería principal de Flask, que nos proporciona las herramientas para crear aplicaciones web.
  • flask_sqlalchemy: Una extensión de Flask que facilita la interacción con bases de datos utilizando SQLAlchemy.

Instancia de la aplicación Flask: Aquí creamos una instancia de la aplicación Flask. __name__ se utiliza para indicar el nombre del módulo actual, lo que es útil para configurar rutas y otros aspectos de la aplicación.

Configuración de la base de datos: Esta línea configura la conexión a la base de datos SQLite. La cadena 'sqlite:////home/jdiaz/proyecto/base.db' especifica la ubicación del archivo de la base de datos.

Instancia de SQLAlchemy: Creamos una instancia de SQLAlchemy y la vinculamos a nuestra aplicación Flask. Esto nos permite utilizar SQLAlchemy para definir modelos y realizar operaciones en la base de datos.

Contexto de la aplicación: Esta línea crea un contexto de aplicación. Esto es necesario para que podamos acceder a la base de datos desde la línea de comandos o en entornos donde no se ejecuta la aplicación completa.

Definición del modelo User:

  • class User(db.Model): Define una clase llamada User que hereda de db.Model. Esta clase representa una tabla en nuestra base de datos.
  • id = db.Column(db.Integer, primary_key=True): Define una columna llamada id de tipo entero, que será la clave primaria de la tabla.
  • username, email, password: Definen columnas para el nombre de usuario, correo electrónico y contraseña, respectivamente. Los atributos unique=True y nullable=False indican que estos campos deben ser únicos y no pueden estar vacíos.

Método __repr__: Este método especial define cómo se representa un objeto User cuando se convierte en una cadena. Por ejemplo, si imprimes un objeto User, verás algo como User('nombre_usuario','[email protected]').

Probar conexión con base de datos en la terminal

Para probar la conexión con la base de datos en la terminal, basta con iniciar el REPL de python desde el directorio de la aplicación (preferiblemente desde el entorno virtual), importar el objeto ‘db’ desde el paquete que lo contiene y ejecutar el comando «db.create_all()»:

$ python3
Python 3.12.3 (main, Nov  6 2024, 18:32:19) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from app import db
>>> db.create_all()

Este va a crear el archivo definido en el script y a su vez, las tablas definidas en el modelo. Con esto estamos comprobando que la conexión con la base de datos SQLite se ha realizado exitosamente y podremos seguir desarrollando nuestra aplicación y hacer las configuraciones necesarias.

By Jorman Diaz

Técnico en electrónica y estudiante de programación camino a Full Stack. perfil de Gravatar

Publicaciones Relacionadas