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:
- Integer: crea un entero aleatorio entre dos valores
- UUID: crea un UUID aleatorio
- Sequence: crea números enteros en secuencia si se llaman varias veces
- Name: crea un nombre aleatorio a partir de una lista de data/names/names.txt
- 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
- 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
![Andrés Cruz Andrés Cruz](/public/images/perfil.jpg)
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter