对象关系映射器(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.
中了解更多信息快乐编码!