Сидеры и фабрики
Пустой блог неудобно разрабатывать: чтобы проверить список или постраничный вывод, нужны статьи. Сидер — класс, который записывает в базу начальные данные. Фабрика — описание того, как создать модель со случайными, но правдоподобными значениями. Вместе они наполняют базу за секунду.
Сидер
node ace make:seeder postПоявится файл database/seeders/post_seeder.ts. Запишите в метод run пару статей:
// database/seeders/post_seeder.ts
import { BaseSeeder } from '@adonisjs/lucid/seeders'
import Post from '#models/post'
export default class extends BaseSeeder {
async run() {
await Post.createMany([
{ title: 'Добро пожаловать', body: 'Первая статья блога.', isPublished: true },
{ title: 'О проекте', body: 'Блог написан на AdonisJS.', isPublished: true },
])
}
}Запустите все сидеры:
node ace db:seedВ таблице posts появятся две статьи — откройте /posts и убедитесь.
Фабрика
Когда нужно много записей, писать их руками долго. Создайте фабрику:
node ace make:factory post// database/factories/post_factory.ts
import factory from '@adonisjs/lucid/factories'
import Post from '#models/post'
export const PostFactory = factory
.define(Post, async ({ faker }) => {
return {
title: faker.lorem.sentence(),
body: faker.lorem.paragraphs(3),
isPublished: true,
}
})
.build()Функция получает объект faker из библиотеки Faker, которая генерирует случайные тексты, имена и адреса. Каждый вызов фабрики даёт новые значения.
Фабрика в сидере
// database/seeders/post_seeder.ts
import { BaseSeeder } from '@adonisjs/lucid/seeders'
import { PostFactory } from '#database/factories/post_factory'
export default class extends BaseSeeder {
async run() {
await PostFactory.createMany(30)
}
}После node ace db:seed в блоге будет 30 статей — достаточно, чтобы проверить три страницы по десять.
Связанные записи
Создайте CommentFactory так же, затем укажите связь в фабрике статей:
// database/factories/post_factory.ts
import { CommentFactory } from '#database/factories/comment_factory'
export const PostFactory = factory
.define(Post, async ({ faker }) => ({
title: faker.lorem.sentence(),
body: faker.lorem.paragraphs(3),
isPublished: true,
}))
.relation('comments', () => CommentFactory)
.build()// database/seeders/post_seeder.ts
await PostFactory.with('comments', 3).createMany(10)Получится 10 статей, у каждой по три комментария. Внешний ключ postId фабрика заполнит сама.
Пересоздание базы
Чтобы начать с чистой базы, удобна одна команда:
node ace migration:fresh --seedОна удалит все таблицы, применит миграции заново и запустит сидеры.
Частая ошибка
db:seed запускает все сидеры при каждом вызове, поэтому повторный запуск добавит те же статьи ещё раз. Для разработки пересоздавайте базу через migration:fresh --seed. И никогда не запускайте сидеры с тестовыми данными на рабочем сервере.