用Prisma Orm向数据库播种
#javascript #typescript #node #prisma

对象关系映射器(ORM)是一种存储,检索,更新和删除数据库的技术。 ORMS让我们将模型定义为映射到数据库中表的类。

当涉及ORM时,我们有很多选择,例如semelize,typeorm,knex和prisma。

在本文中,我们将介绍Prisma,这是您下一个应用程序中ORM的最佳选择。

Prisma是开源的下一代节点。JS和打字稿ORM。它将自己描述为一个下一代ORM,使应用程序开发人员易于使用数据库。

它是用打字稿编写的,这使我们进入了类型安全的数据库模式。当然,一切都需要设置好以定义该数据库的外观。它从编写数据库查询中抽象开发人员,从而确保我们编写安全的数据库访问模式。

最棒的事情是设置和编写数据库,模型数据,数据验证并描述不同数据字段之间的关系的Prisma-client。它不仅具有迁移工具和一个超酷的GUI可视化您的数据。

开箱即用的工具:

Prisma Client:自动生成和类型安全的Prisma查询构建器

Prisma Migrate:迁移系统

Prisma Studio:用于浏览和管理数据库中数据的现代GUI

将Prisma与DB连接

我们将遵循文档以开始使用Prisma。您可以阅读并参考documentation

对于演示,我们正在使用prisma以及我们的示例节点项目中的typecript与Railway中的mongodb实例连接。

我们需要一个数据库连接字符串,我们将从铁路here获得MongoDB数据库连接URL。

npx prisma init --datasource-provider mongodb

我们将把数据源块的URL字段设置为我们最近创建的数据库连接URL。

集,URL是通过.env中定义的环境变量设置的。

DATABASE_URL="******"

建模数据

我们可以从为应用程序建模数据开始。 Prisma模式提供了一种模型数据的直观方法。将以下模型添加到您的架构。prisma


// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

model User {
  id            String    @id @default(auto()) @map("_id") @db.ObjectId
  name          String?
  image         String
  company       String
  createdAt     DateTime  @default(now())
  updatedAt     DateTime  @updatedAt
  email         String    @unique
  emailVerified DateTime?
  password      String
}

model Products {
  id          String   @id @default(auto()) @map("_id") @db.ObjectId
  title       String   @unique
  description String
  price       String
  size        String
  quantity    Int
  image       String
  createdAt   DateTime @default(now())
}

enum Role {
  User
  Admin
  Buyer
  Seller
}

我们创建了我们的数据模型。

我们正在建立类似市场的东西,用户可以将产品清单上传到市场。并且有一些产品列表,我们希望与创建的新用户一起播种DB。

我们需要运行两个命令,以便我们可以设置应用程序所需的文档和表。

npx prisma generate

此命令将使用我们定义的数据模型生成所需的表来存储我们的数据。

npx prisma studio

这将旋转GUI,当我们将表和/或数据插入DB时,我们可以在其中查看。

添加虚假数据

在开始播种我们的数据库之前,我们需要一些虚假数据。为了生成一些相当的逼真的虚假数据,我们正在使用两个库。

让我们两者都安装。

npm i @ngneat/falso @faker-js/faker 

我们还将安装一个库来哈希,以哈希的伪造用户密码。

@types/bcryptjs bcryptjs

让我们创建一个新文件并将其命名 seed.ts

import bcrypt from 'bcryptjs';
import { randBetweenDate, randNumber, randProduct } from "@ngneat/falso";
import { faker } from "@faker-js/faker";
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

const main = async () => {
  try{
    await prisma.products.deleteMany();
    const email = faker.internet.email('ishan', 'manandhar', 'example.fakerjs.dev');
    const companyName = faker.company.companyName()
    const hashedPassword = await bcrypt.hash('my_secure_password', 10);
    await prisma.products.deleteMany(); //delete existing products
    const fakeProducts = randProduct({
      length: 300,
    });

    // cleanup the existing database
    await prisma.user.delete({ where: { email } }).catch(() => {
      // delete existing user found with same email
    });

    await prisma.user.create({
      data: {
        name: 'ishan',
        image: '',
        email: email,
        password: hashedPassword,
        company: companyName
      },
    });

    for (let index = 0; index < fakeProducts.length; index++) {
      const product = fakeProducts[index];
      const name = faker.commerce.productName();
      await prisma.products.upsert({
        where: {
          title: name,
        },
        create: {
          title: name,
          description: faker.lorem.paragraph() || product?.description,
          price: faker.commerce.price(),
          image: faker.image.abstract(640, 480, true),
          quantity: randNumber({ min: 10, max: 100 }),
          size: faker.random.numeric(),
          createdAt: randBetweenDate({
            from: new Date("10/07/2020"),
            to: new Date(),
          }),
        },
        update: {},
      });
    }
    console.log(`Database has been seeded. 🌱`);
  }
  catch(error){
    throw error;
  }
}

main().catch((err) => {
  console.warn("Error While generating Seed: \n", err);
});

让我们用命令运行种子文件

npx prisma db seed

成功运行种子文件后,我们可以前往终端并运行npx prisma studio,以查看我们的数据添加到我们的文档中。

是的,我们已经做到了!

结论

Prisma是一个很棒的ORM,具有最佳的开发人员体验(DX),文档,可观察性支持和我们无法获得的端到端打字稿覆盖范围。

它使与数据库合作从数据建模,运行,迁移,编写查询并将其与API集成在一起的数据库中感到如此直观和直接。

您可以从Prisma official docs here.

中了解更多信息

快乐编码!