Flask Seeder para generar datos de prueba

Video thumbnail

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.

Una vez creado nuestros formularios en Flask mediante Flask WTF, vamos a comenzar.

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.

Siguiente paso, aprende a configurar la Cache en Flask.

Más información en:

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

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.

Acepto recibir anuncios de interes sobre este Blog.

Andrés Cruz

EN In english
<script> window.addEventListener('scroll', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); window.addEventListener('mousemove', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); window.addEventListener('touchstart', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); // Fallback if no interaction window.addEventListener('load', function() { setTimeout(function() { if (!window.scriptsLoaded) loadThirdPartyScripts(); }, 8000); }); function loadThirdPartyScripts() { if (window.scriptsLoaded) return; window.scriptsLoaded = true; console.log('Loading third party scripts...'); // Google Analytics var gtagScript = document.createElement('script'); gtagScript.src = 'https://www.googletagmanager.com/gtag/js?id=G-F22688T9RL'; gtagScript.async = true; document.head.appendChild(gtagScript); gtagScript.onload = function() { window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-F22688T9RL'); }; // Google ADS const adScript = document.createElement('script'); adScript.src = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"; adScript.setAttribute('data-ad-client', 'ca-pub-5280469223132298'); adScript.async = true; document.head.appendChild(adScript); // Facebook Pixel (function(f, b, e, v, n, t, s) { if (f.fbq) return; n = f.fbq = function() { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments) }; if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0'; n.queue = []; t = b.createElement(e); t.async = !0; t.src = v; s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s); })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1643487712945352'); fbq('track', 'PageView'); } </script> <noscript> <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1643487712945352&ev=PageView&noscript=1" /> </noscript>