Creando un seeder casero a la typescript

Creando mi propio seeder para el proyecto

hace un año   •   3 min de lectura

Por Andrés Tuñón
evita un potencial desastre
Tabla de contenidos

Hace unos días estaba apunto de empezar otra funcionalidad, pero me di cuenta que necesitaba mucha más información inicial y relacionada en la base de datos

En ese momento fue que empecé a investigar si había una librería para seedear a partir de un script para firestore, como lo hace sequelize-cli, prisma o similares

La investigación me llevo a una librería sin pruebas y un excelente artículo (que dejaré en las referencias) que me motivo a realizar mi propio seeder.

Receta

Resultado
Resultado

Ingredientes

  • NodeJS
  • Una base de datos transaccional*
  • Typescript al gusto

Si no encuentra una bd transaccional, puede reemplazarlo por un ORM que maneje transacciones, pero perderá cierto ÁCIDO

¿Qué vamos a cocinar?

Un seeder es solo un script que agrega la información inicial en una base de datos, se utiliza generalmente para testear en un ambiente local. Un sinónimo podría ser la primera migración para una estrategia code-first.

Dejemos marinar la base de datos

Antes de empezar no explicaré como inicializar y conectar con la base de datos, son un sin fin de ORM y formas, voy a asumir que ya tienes la conexión lista para realizar la primera consulta; en el caso de firestore:

inicializando firebase
inicializando firebase

Desde aquí solo es importar getDb y usarlo como verán más adelante

Preparación de la masa

Debes armar la data inicial que deseas en un archivo aparte, un simple JSON que exportas, en este caso streamers

Creamos el relleno

Para crear los scripts hay un código base, que es simplemente tener la referencia a la base de datos y ejecutarlo de forma segura, por eso recomiendo que sea a través de una transacción o lo más atómico posible:

Usualmente las migraciones y seeders tienen una lógica de creación y otra de destrucción.

En otras palabras:

  • Un paso donde se crean las tablas, columnas y filas (se le llama up)
  • Un paso donde se eliminan tablas, columnas y filas (se le llama down).

Simplemente replicaré eso en 2 archivos distintos:

Podrás notar que esta vez esta envuelto en un self invoking function para que me permita ejecutar varias acciones utilizando el await

Se logra el mismo resultado creando la funcion aparte y ejecutandola al final

Otra razón fue que al trabajar con transacciones primero consultas y luego actualizas, suelo verlo así y firestore no fue la excepción en detallarlo

Sirviendo los comandos

Teniendo los scripts listos puedes instalar ts-node, en caso de utilizar js simplemente con node:

comandos en package.json
comandos en package.json

Para js seria algo como: "node src/seed/up.js", por ultimo mostraré un ejemplo de como puedes organizar los archivos:

archivos
archivos

Referencias

Journey to the Firebase: Seeding Cloud Firestore and Authentication
As part of my capstone project at the coding bootcamp, my team decided to use Firebase to serve as our back-end. Building a social media…
artículo que me inspiró
ts-node
TypeScript execution environment and REPL for node.js, with source map support. Latest version: 10.9.1, last published: 5 months ago. Start using ts-node in your project by running `npm i ts-node`. There are 7108 other projects in the npm registry using ts-node.
ts-node

Corre la voz

Sigue leyendo