Masonite 熟悉步骤小记录 (八、数据工厂)

seed 体验

首先在项目里可以看到 masonite 默认准备的一个 seeder,位于 masapp/databases/seeds/user_table_seeder.py,这个 seeder.py 是这样写的:

from orator.seeds import Seeder

from app.User import User
from config.factories import factory

class UserTableSeeder(Seeder):

    def run(self):
        factory(User, 50).create()

可以看到这个 seeder 引入了 masapp/config/factories.py 模块的 factory 类:

from orator.orm import Factory
from app.User import User

factory = Factory()

def users_factory(faker):
    return {
        'name': faker.name(),
        'email': faker.email(),
        'password': '$2b$12$WMgb5Re1NqUr.uSRfQmPQeeGWudk/8/aNbVMpD1dR.Et83vfL8WAu',  # == 'secret'
        }

factory.register(User, users_factory)

现在可以使用命令播种数据了:

(env) $ craft seed:run

自制 seeder

准备一个模型和数据表:

(env) $ craft model Todo
(env) $ craft migration create_todos_table --create todos

对这个新的 migration 数据表文件 masapp/databases/migrations/2020_06_07_114541_create_todos_table.py 进行添加字段的编写:

table.string('name')
table.text('description')
table.integer('user_id').unsigned()
table.foreign('user_id').references('id').on('users')

首先在 masapp/config/factories.py 这个工厂模块中添加:

from app.Todo import Todo
import random

def todos_factory(faker):
    return {
        'name': faker.name(),
        'description': faker.paragraph(),
        'user_id': random.randint(1, 50)
    }

factoru.register(Todo, todos_factory)

然后生成 masapp/databases/seeds/todo_table_seeder.py

(env) $ craft seed Todo
from orator.seeds import Seeder

class TodoTableSeeder(Seeder):

    def run(self):
        pass

对这个 seeder 进行一些设定:

from orator.seeds import Seeder
from app.Todo import Todo
from config.factories import factory

class TodoTableSeeder(Seeder):

    def run(self):
        factory(Todo, 50).create()

把原来的 masapp/databases/seeds/database_seeder.py

from orator.seeds import Seeder
from .user_table_seeder import UserTableSeeder

class DatabaseSeeder(Seeder):
    def run(self):
        self.call(UserTableSeeder)

添加新编写的 seeder:

from orator.seeds import Seeder
from .user_table_seeder import UserTableSeeder
from .todo_table_seeder import UserTableSeeder

class DatabaseSeeder(Seeder):
    def run(self):
        self.call(UserTableSeeder)
        self.call(TodoTableSeeder)

之后可以回滚迁移:

(env) $ craft migrate:refresh -s
本作品采用《CC 协议》,转载必须注明作者和本文链接
不要试图用百米冲刺的方法完成马拉松比赛。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!