Swiftpack.co - Package - Appsaurus/FluentSeeder


Swift Vapor Swift Package Manager License

FluentSeeder makes it easier to seed Fluent models. For testing purposes, it can create psuedo realistic random data for your models based on their property names and types using RandomFactory.


FluentSeeder is available through Swift Package Manager. To install, add the following to your Package.swift file.

let package = Package(
    name: "YourProject",
    dependencies: [
        .package(url: "https://github.com/Appsaurus/FluentSeeder", from: "0.1.0"),
    targets: [
      //If just using for test purposes (recommended use case)
      .testTarget(name: "YourAppTests", dependencies: ["FluentSeeder", ... ])
      //Not recommended but still possible to use to seed your actual app.
      .target(name: "YourApp", dependencies: ["FluentSeeder", ... ])


1. Import the library

import FluentSeeder

2. Implement Seeder

Registering and configuration of services, databases, and migrations can be done via overriding register(services:), configure(databases:) and configure(migrations:) respectively.

public class ExampleSeeder: Seeder{
	public typealias Database = SQLiteDatabase
	open static func seeds() -> [SeedProtocol]{
		return [
			//Seed models first
			Seed<ExampleModel>(count: 50),
			Seed<ExampleSiblingModel>(count: 25),
			Seed<ExampleChildModel>(count: 10),

			//Then relationships that depend on those models existing
			SiblingSeed<ExampleModelSiblingPivot>(count: 10),
			//You can seed parents for each child
			ParentSeed<ExampleModel, ExampleChildModel>(at: \.optionalParentModelId)
			//Or if you prefer to seed the relationship in the other direction (possibly for one-to-many relationship)
			ChildSeed<ExampleModel, ExampleChildModel>.init(count: 3, at:  \.optionalParentModelId)

3. Add your seeder's migration to the database

//Don't forget to add your model mirations first
migrations.add(model: ExampleModel.self, database: .sqlite)
migrations.add(model: ExampleSiblingModel.self, database: .sqlite)
migrations.add(model: ExampleChildModel.self, database: .sqlite)
migrations.add(model: ExampleModelSiblingPivot.self, database: .sqlite)

migrations.add(migration: ExampleSeeder.self, database: .sqlite)

Custom seeds

By supplying a ModelFactory to the Seed initializer, you can customize how your model is initialized and override the default randmized data. For relationship seeds, you can supply querys to filter which models are included when creating relationships are formed. For SiblingSeed you can optionally supply a leftQuery and rightQuery, and for ParentSeed and ChildSeed you can optionally supply parentQuery and childQuery. If no queries are provided, random samples are taken from each seeded model, or all models are iterated depending upon the direction of the seeded relationship.


We would love you to contribute to FluentSeeder, check the CONTRIBUTING file for more info.


FluentSeeder is available under the MIT license. See the LICENSE file for more info.


Stars: 0
Help us keep the lights on