DEV Community

toyamarinyon
toyamarinyon

Posted on

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")
}
Enter fullscreen mode Exit fullscreen mode

In this case, the seed script looks like this

// create bob
const bob = await prisma.user.create({
  create: {
    email: "bob@prisma.io",
    username: "bob",
    lastName: "curry",
    firstName: "bob",
    school: "demo",
  },
});

// create Chance
const chance = await prisma.user.create({
  create: {
    email: "chance@prisma.io",
    username: "chance",
    lastName: "weber",
    firstName: "chance",
    school: "demo",
  },
});
:
:
:
Enter fullscreen mode Exit fullscreen mode

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' })
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)