Use factory to simplify prisma seed
Prisma provides the ability to seed data. Once configured, it is convenient to create a seed with the script npx prisma db seed
.
However, when you register data with the seed script, you need to enter all the parameters, which is a tedious aspect of preparation.
Let’s consider the following table as an example
model User {
id Int @id @default(autoincrement())
email String @unique
userName String @unique
lastName String
firstName String
school String
@@map(name: "users")
}
In this case, the seed script looks like this
// create bob
const bob = await prisma.user.create({
create: {
email: "[email protected]",
username: "bob",
lastName: "curry",
firstName: "bob",
school: "demo",
},
});
// create Chance
const chance = await prisma.user.create({
create: {
email: "[email protected]",
username: "chance",
lastName: "weber",
firstName: "chance",
school: "demo",
},
});
:
:
:
It may be enough, but it seemed a bit redundant to me. It is tedious to enter the parameters every time.
As a solution, I implemented the factory function using a library such as faker.js, but it’s hard to maintain the factory function every time the number of tables or items increases.
So I thought that one of the ideal development flows would be to have a factory function created using npx prisma migrate dev
or npx prisma generate
, which is executed when a table is added or an item is added in Prisma.
Prisma has a good mechanism called generator, so I used it to create a generator called prisma-factory-generator
that creates a factory from Prisma’s Scheme.
https://github.com/toyamarinyon/prisma-factory-generator
Using this, we can rewrite the previous seed script to look like this.
// For the sake of clarity, I have omitted imports
// and grammatical descriptions.
const bob = await createUser({ userName: "bob" });
const chance = await createUser({ userName: "chance" });
I think Prisma-factory-generator
is useful not only for seeding but also for test code, so please try it if you like.
If you have a case where it doesn’t work, please send an issue to https://github.com/toyamarinyon/prisma-factory-generator/issues.
Special Thanks
The idea of creating a factory with Prisma generator is based on Chris Ball’s presentation at Prisma Day 2021.
discussion: https://github.com/echobind/prisma-factory/discussions/1
presentation: https://www.youtube.com/watch?v=a5S5thDd7Xg