Flask Seeder para generar datos de prueba

Los datos son una parte fundamental del sistema y al momento de desarrollar la aplicación, siempre es necesario tener datos de prueba para probar cada uno de los módulos implementados de la aplicación que estamos desarrollando; crear estos datos de manera manual siempre es tedioso y cuando son muchos datos o muchas entidades a los cuales tendríamos que crear estos datos de prueba sería una pesadilla; es por eso que los frameworks modernos como Flask proveen un mecanismo para generar estos datos de prueba; en el caso de Flask, al ser un micro framework debemos de instalar un paquete adicional llamado Flask Seeder.

Flask-Seeder es un paquete muy simple de emplear, provee de una clase base Seeder que contiene un identificador de base de datos y un método run(), en donde obtenemos el acceso al objeto (instancia del modelo) a manipular y crear los datos en la base de datos. También cuenta con un comando para ejecutar las pruebas y algunos métodos tipo Faker que podemos emplear para generar data aleatoria como nombres e emails.

En realidad, no sería necesario emplear este tipo de paquetes, perfectamente podríamos crear algún controlador que junto con un ciclo nos genere algunos o datos de prueba, pero, empleando este paquete podemos tener una mejor modularización para la aplicación aparte de que tenemos acceso a los Faker.

Una clase Faker luce como:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_seeder import FlaskSeeder

def create_app():
  app = Flask(__name__)

  db = SQLAlchemy()
  db.init_app(app)

  seeder = FlaskSeeder()
  seeder.init_app(app, db)

  return app

En donde tenemos presentes los componentes mencionados anteriormente; para ejecutar la prueba:

$ flask seed run

Todos estas clases están alojados en archivos y estos dentro de una carpeta llamada seeds/ y estas clases deben de heredar de Seeder para que puedan ser detectados por Flask Seeder.

Puedes ver un ejemplo de cómo generar datos de prueba empleando el generador:

# All seeders inherit from Seeder
class DemoSeeder(Seeder):

  # run() will be called by Flask-Seeder
  def run(self):
    # Create a new Faker and tell it how to create User objects
    faker = Faker(
      cls=User,
      init={
        "id_num": generator.Sequence(),
        "name": generator.Name(),
        "age": generator.Integer(start=20, end=100)
      }
    )

    # Create 5 users
    for user in faker.create(5):
      print("Adding user: %s" % user)
      self.db.session.add(user)

Para instalar el paquete tenemos:

$ pip install Flask-Seeder

En cuanto a los Faker o generadores de datos falsos, tenemos unos pocos que podemos emplear:

  1. Integer: crea un entero aleatorio entre dos valores
  2. UUID: crea un UUID aleatorio
  3. Sequence: crea números enteros en secuencia si se llaman varias veces
  4. Name: crea un nombre aleatorio a partir de una lista de data/names/names.txt
  5. Email: cree un correo electrónico aleatorio, una combinación del generador de nombres aleatorios y un dominio a partir de data/domains/domains.txt
  6. String: Generación de cadenas a partir de un patrón.

En base a la aplicación que hemos venido desarrollando, vamos a generar datos de prueba para las categorías y tags:

app\seeds\seed.py

from flask_seeder import Seeder, Faker, generator

from my_app.blog import models

class CategorySeeder(Seeder):

  # run() will be called by Flask-Seeder
  def run(self):
    # Create a new Faker and tell it how to create Category objects
    faker = Faker(
      cls=models.Category,
      init={
        "name": generator.Name(),
      }
    )

    # Create 5 categories
    for category in faker.create(5):
      print("Adding category: %s" % category)
      self.db.session.add(category)

Importante notar que la carpeta de seeds se encuentra al mismo nivel del módulo de la aplicación:

app\seeds\seed.py

Y no dentro:

app\my_app\seeds\seed.py

Ya que si lo colocas dentro de my_app, Flask Seeder no va a reconocer la carpeta seeds y por lo tanto no va a ejecutar los seeders.

Finalmente, ejecutamos el siguiente comando:

$ python -m flask seed run

O

$ flask seed run

Y deberíamos de ver estos datos creados en nuestra base de datos; puedes ejecutar el comando anterior las veces que quieras o necesites y variar la lógica a tu gusto.

Más información en:

https://pypi.org/project/Flask-Seeder/

Acepto recibir anuncios de interes sobre este Blog.

Flask proveen un mecanismo para generar datos de prueba; en el caso de Flask, al ser un micro framework debemos de instalar un paquete adicional llamado Flask Seeder.

- Andrés Cruz

In english