Creación de una Interfaz CRUD con Streamlit y SQLModel



En el video de hoy, exploramos un caso práctico y muy interesante: la creación de una interfaz CRUD (Create, Read, Update, Delete) utilizando Streamlit y SQLModel. Estas operaciones son fundamentales para la manipulación de bases de datos. Aunque Streamlit es una herramienta poderosa para crear interfaces, no siempre trabajamos con datos en formato de dataframes o archivos de Excel. A veces, necesitamos capturar información directamente desde una interfaz gráfica.



Contexto del Proyecto

Para este proyecto, creamos una solución básica que simula una encuesta laboral global. La interfaz permite recopilar información como el rol de la persona, edad, años de experiencia, país, salario en dólares y habilidades. Esta información se puede crear, editar y eliminar directamente desde la interfaz.

Herramientas Utilizadas

  1. Streamlit: Framework para crear interfaces interactivas.
  2. SQLModel: Librería para manipular bases de datos desde código Python.
  3. PostgreSQL: Sistema de gestión de bases de datos.
  4. ElephantSQL: Plataforma para alojar bases de datos PostgreSQL.

Paso a Paso de la Implementación

1. Configuración de la Base de Datos

Primero, configuramos nuestra base de datos en ElephantSQL. Esta plataforma ofrece un plan gratuito que incluye una base de datos PostgreSQL de 5 GB, ideal para pruebas y desarrollo.

2. Definición del Modelo de Datos

Utilizamos SQLModel para definir nuestro modelo de datos. SQLModel es una librería creada por Sebastián Ramírez, también conocido por FastAPI. Nos permite manipular bases de datos desde código Python, abstraiendo las sentencias SQL.

from sqlmodel import SQLModel, Field, create_engine, Session
from typing import Optional, List

class Country(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(unique=True, nullable=False)
    surveys: List["Survey"] = []

class Role(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(unique=True, nullable=False)
    surveys: List["Survey"] = []

class Survey(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    role_id: int = Field(foreign_key="role.id")
    age: int
    years_of_experience: int
    country_id: int = Field(foreign_key="country.id")
    salary: float
    skills: str
    submission_date: datetime = Field(default_factory=datetime.utcnow)
    role: Optional["Role"] = Relationship(back_populates="surveys")
    country: Optional["Country"] = Relationship(back_populates="surveys")

3. Conexión a la Base de Datos

Configuramos la conexión a la base de datos utilizando un archivo de configuración. Esto nos permite mantener nuestras credenciales de conexión de manera segura y organizada.

import configparser

config = configparser.ConfigParser()
config.read('config.ini')

database_url = config['postgres']['database_url']
engine = create_engine(database_url)

4. Operaciones CRUD

Implementamos las operaciones CRUD utilizando SQLModel. Aquí hay un ejemplo de cómo crear, leer, actualizar y eliminar registros.

Crear un Registro

def create_survey(role_id, age, years_of_experience, country_id, salary, skills):
    with Session(engine) as session:
        survey = Survey(
            role_id=role_id,
            age=age,
            years_of_experience=years_of_experience,
            country_id=country_id,
            salary=salary,
            skills=skills
        )
        session.add(survey)
        session.commit()
        session.refresh(survey)
        return survey

Leer un Registro

def get_survey(survey_id):
    with Session(engine) as session:
        survey = session.get(Survey, survey_id)
        return survey

Actualizar un Registro

def update_survey(survey_id, role_id, age, years_of_experience, country_id, salary, skills):
    with Session(engine) as session:
        survey = session.get(Survey, survey_id)
        survey.role_id = role_id
        survey.age = age
        survey.years_of_experience = years_of_experience
        survey.country_id = country_id
        survey.salary = salary
        survey.skills = skills
        session.commit()
        session.refresh(survey)
        return survey

Eliminar un Registro

def delete_survey(survey_id):
    with Session(engine) as session:
        survey = session.get(Survey, survey_id)
        session.delete(survey)
        session.commit()

5. Interfaz con Streamlit

Finalmente, creamos la interfaz utilizando Streamlit. Aquí hay un ejemplo de cómo se ve el formulario para crear y editar registros.

import streamlit as st

st.title("Encuesta Laboral Global")

roles = get_roles()
countries = get_countries()

def survey_form(survey_id=None):
    if survey_id:
        survey = get_survey(survey_id)
    else:
        survey = Survey()

    with st.form(key='survey_form'):
        role = st.selectbox("Rol", roles, index=roles.index(survey.role.name) if survey.role else 0)
        age = st.number_input("Edad", value=survey.age if survey.age else 0)
        years_of_experience = st.number_input("Años de Experiencia", value=survey.years_of_experience if survey.years_of_experience else 0)
        country = st.selectbox("País", countries, index=countries.index(survey.country.name) if survey.country else 0)
        salary = st.number_input("Salario", value=survey.salary if survey.salary else 0.0)
        skills = st.text_area("Habilidades", value=survey.skills if survey.skills else "")

        submitted = st.form_submit_button(label='Enviar')

        if submitted:
            role_id = roles[role].id
            country_id = countries[country].id
            if survey_id:
                update_survey(survey_id, role_id, age, years_of_experience, country_id, salary, skills)
            else:
                create_survey(role_id, age, years_of_experience, country_id, salary, skills)
            st.success("Encuesta guardada exitosamente")

survey_form()

Conclusión

Este proyecto demuestra cómo utilizar Streamlit y SQLModel para crear una interfaz CRUD sencilla y eficiente. Esta solución es ideal para capturar información y puede ser expandida para crear sistemas de información más complejos. Las herramientas utilizadas, como ElephantSQL y PostgreSQL, facilitan el alojamiento y la manipulación de bases de datos, haciendo que este enfoque sea accesible incluso para aquellos con poca experiencia en desarrollo de bases de datos.

Espero que este tutorial les sea útil para sus proyectos. Si tienen alguna pregunta o comentario, no duden en dejarlo en la sección de comentarios. ¡Hasta la próxima!

Publicar un comentario

0 Comentarios