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/

- Andrés Cruz

In english
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.