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.
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.
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.
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")
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)
Implementamos las operaciones CRUD utilizando SQLModel. Aquí hay un ejemplo de cómo crear, leer, actualizar y eliminar registros.
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
def get_survey(survey_id):
with Session(engine) as session:
survey = session.get(Survey, survey_id)
return survey
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
def delete_survey(survey_id):
with Session(engine) as session:
survey = session.get(Survey, survey_id)
session.delete(survey)
session.commit()
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()
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!
0 Comentarios