Saltar a contenido

Crear un CRUD básico 🕹

A lo largo de la vida de un proyecto, cuando creamos nuevas funcionalidades, a menudo necesitamos añadir nuevos recursos a nuestra aplicación. Estos recursos suelen requerir múltiples operaciones repetitivas, que hacemos una y otra vez, cada vez que definimos un nuevo recurso.

Imaginemos un escenario real, donde necesitamos exponer endpoints de CRUD's para 2 entidades, digamos Roles y Locales, y para cada entidad tendríamos que realizar varias operaciones, como sigue:

  • Generar un módulo (carpeta) para mantener el código organizado y establecer límites claros (agrupando componentes relacionados).
  • Generar una vista para definir rutas CRUD e implementar la lógica de negocio.
  • Generar un modelo (clase) para representar la tabla de la base de datos.
  • Generar Objetos de Transferencia de Datos (DTO) para definir cómo se enviarán los datos a través de la red y como se validarán.
  • Generar esquemas (JSONSchema) para validar datos.
  • Generar archivos y/o carpetas para utilizar lógica de negocio adicional, relacionada con el módulo.

... y que todo esto, mantenga una estructura organizada para tu proyecto.

Son muchos pasos...😭

generadores al rescate

Para ayudar a acelerar este proceso repetitivo, Callisto proporciona un generador que automágicamente crea todo el código boilerplate para ayudarnos a evitar hacer todo esto, y hacer la experiencia del desarrollador mucho más simple.

veamos:

Alt Text

ejecutamos el comando crud, utilizando Poetry... 🥁

$ poetry exec crud

  • definir el nombre del módulo

    CRUD modules for Callisto 🦄
    ? Escribe un nombre para el módulo: roles
    

  • definir el tipo de router a utilizar

    1
    2
    3
    4
    ? Selecciona el tipo de módulo: (Use arrow keys)
       Default CRUD (APIRouter)
     » JSON Over Post
       Ninguno (Salir)
    

  • definir el tipo de ORM

    1
    2
    3
    4
    ? Deseas utilizar un ORM? (Use arrow keys)
     » MongoDB
       Firestore
       Ninguno (sin ORM)
    

  • listo!

    ? Listo? (y/N) Y
    

la salida será algo como:

generating CRUD (JSON over POST) module: roles...

generating folders..
generating urls...
generating views...
generating dto...
generating models...

formatting module...
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/dto/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/helpers/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/models/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/views/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/schemas/__init__.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/urls.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/models/roles_model.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/dto/roles_dto.py
reformatted /home/callisto/projects/awesome-backend/app/modules/roles/views/roles_view.py

All done!  🍰 10 files reformatted.
generating module: roles OK!

please run: [poetry exec fix]

exiting...

creando la siguiente estructura de carpetas dentro de app/modules/ 🏁

├── roles
│   ├── dto
│   │   ├── __init__.py
│   │   └── roles_dto.py
│   ├── helpers
│   │   └── __init__.py
│   ├── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   └── roles_model.py
│   ├── schemas
│   │   └── __init__.py
│   ├── urls.py
│   └── views
│       ├── __init__.py
│       └── roles_view.py

Nota

Para más información revisa el archivo tools/crud_gen.py.

Tras bambalinas el generador utiliza Jinja2 y Questionary.

Routers

Callisto utiliza APIRouter para generar las vistas del módulo.

ORM

de momento, se utilizan los siguientes motores de Bases de Datos:

  • MongoDB
  • Firestore
  • MySQL

Lectura recomendada

Te recomendamos leer el apartado de: