prisma是Node.js生态系统中的主要对象相关映射(ORM)工具。它功能强大,但简单易用。一支伟大的团队也支持它,并且它享有Node.js社区的广泛采用。 Prisma赢得了如此良好的声誉,我们将其纳入了我们的技术堆栈以进行放大。我们不仅将Prisma用于生成的应用程序,而且还将其用于内部技术堆栈中。
在本文中,我们将仔细研究Prisma的一些功能和支持它的团队。 Prisma对放大至关重要,就像节点本身一样,我强烈建议您考虑下一个节点项目。
引入Prisma
prisma是节点生态系统中最受欢迎的ORMS之一,在过去的两年中,它在社区中一直保持一致的增长。其中很大程度上与支持该产品的团队有关。 Prisma是开源的,并在Apache-2.0下获得了许可,这对于您的项目非常灵活,这是一系列令人印象深刻的投资者,例如Heroku,Netlify和GraphQl的主要成员。对Prisma的支持是持续且稳健的,因为团队通过定期发行版的定期发行来进行改进,以解决错误,性能问题和其他增强功能。
选择技术堆栈时最重要的考虑因素之一是确保我使用的任何应用程序或软件包得到很好的支持。不管包裹的性能多么复杂,如果它的支持不足,则在尝试将其适合边缘用例或解决错误时,它可以增加项目的小时。 Prisma的受欢迎程度和开源地位意味着它不仅得到了一个出色的内部团队的支持,而且社区支持也令人难以置信。在通常的论坛上,有很多受过良好教育和经验丰富的Prisma开发人员。
Prisma是邀请新用户的软件包。它是有据可查的,适合您的第一个或50个节点项目。他们的documentation包含有关可用功能的全面信息。您还可以访问多个指南,包括用于部署使用PRISMA的应用程序的介绍性“ How-TOS”,以及从另一个ORM迁移的说明。指南是彻底,最新的,并且易于遵循。此外,Prisma的团队确保您使用他们的ORM的经验尽可能痛苦。
为什么要使用Prisma?
在最简单的情况下,Prisma可以作为ORM访问您的数据库。作为其产品套件的一部分,Prisma提供了“客户端API”,甚至可以使最复杂的数据库操作变得简单。但是Prisma闪耀的地方具有处理复杂的查询操作的能力。
Prisma的API使您可以轻松地穿越关系。以下是一个应用程序访问Prisma Client tutorial数据库的示例。首先,该应用程序通过使用从博客文章到作者的导航属性访问作者的个人资料,最后是作者的个人资料:
const authorProfile: Profile | null = await prisma.post
.findUnique({ where: { id: 1 } })
.author()
.profile();
它也通过暴露有关秩序,限制和光标的论点来使分页变得轻而易举。在下面,您可以看到一个示例,您可以在其中使用id=2
从帖子开始,从而从数据库中获取五个帖子:
// Find the next 5 posts after post id 2
const paginatedPosts3: Post[] = await prisma.post.findMany({
take: 5,
cursor: {
id: 2,
},
});
它还允许汇总查询,例如sum和count:
// Group users by country
const groupUsers = await prisma.User.groupBy({
by: ["country"],
_count: {
id: true,
},
});
除了这些功能外,Prisma的客户还促进了交易,包括中间件和执行原始问题,并有助于使记录变得简单。
,但要限制Prisma的能力仅阅读或编写数据将是一个重大损害。 Prisma的另一个重要方面是它如何处理迁移。 Prisma支持SDL-Fir-First和Code-Inst Ind方法,以在代码中对数据结构进行建模。我建议在创建新应用程序时编写数据库的代码优先方法。不过,使用现有数据库的数据库创建Prisma模式可能会更容易。
如果您决定使用代码优先方法,则可以使用Prisma Migrate在数据库中创建表。首先使用Prisma的标记语言编写模式定义。以下是Prisma教程中的示例:
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile profile?
}
设置模式后,您可以通过选择Prisma支持的提供商之一来准备数据库。在下面的示例中,我正在使用PostgreSQL,但是有几个可用的选项,例如MySQL,SQLITE,MONGODB,COCKRACHDB和MICROSOFT SQL SERVE:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
使用您的模式和提供商集,Prisma现在能够将您的模式转换为可执行代码以创建您的数据库:
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL,
"name" VARCHAR(200) NOT NULL,
PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Post" (
"id" SERIAL,
"title" VARCHAR(150) NOT NULL,
"published" BOOLEAN NOT NULL DEFAULT true,
"authorId" INTEGER NOT NULL,
PRIMARY KEY ("id")
);
-- AddForeignKey
ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
这很简单。如果您从PostgreSQL切换到MySQL(或任何其他提供商),请更改您的提供商并重建迁移。如果需要创建种子数据,则可以配置应用程序以了解您的种子数据在哪里,并使用Prisma客户端插入您需要的任何数据。
使用Prisma进行放大
当然,您需要能够将数据从数据库获取给用户。放大将从输入UI的配置中创建一个schema.prisma
文件。该文件将包含创建数据库所需的所有字段,类型和关系。您在UI中创建的每个实体还将生成一系列类。由于放大是建立在Nestjs上的,因此我们生成一个模块,一个解析器和一项服务,以促进对实体的API处理查询。
首先,该服务是我们使用Prisma查询或修改数据库中的数据的地方。我们生成了键入的类,以表示每个查询的参数,例如CustomerFindManyarguments。然后,我们为PRISMA创建包装方法,例如findMany
,该方法从Prisma客户端称为客户收集的Findmany函数,并将CustomerFindermanyArguments的实例传递给了它。 Prisma客户端使用这些参数来过滤您的数据或使用分页。
prisma.schema
。这有助于同步有关所需字段和类型的API和数据库。然后,我们可以使用这些类型的类来宣传应用程序API的结构。最后,我们将模块注册到应用程序中,然后将应用程序注册为Swagger。您会注意到,Args
课程中的字段都装饰有APIProperty
。这为创建API文档所需的所有详细信息提供了夸张。
仔细观察CustomerFindermanyArguments类,揭示了我们还使用@nestjs/graphql
中的装饰器。通过这样做,我们可以在您的数据中提供可用字段的GraphQL。然后,我们生成一个解析器来选择该应用程序将通过GraphQL展示的内容。解析器取决于您应用程序生成的实体服务。
最后,放大将为您的API生成Swagger文档,该文档完全代表您的端到端数据传输。
You can review the koude7 in our sample application for a closer look.
包起来
现在,您可以看到为什么Prisma已经成为放大堆栈不可或缺的一部分。它简单易用,但功能强大且完全具有特色。支持该产品的团队也为增强它做得非常出色。结果,Prisma将成为我们可预见的未来堆栈的一部分,我们建议您也将其作为您的一部分。
如果您对放大及其简化开发工作流程的潜力感到兴奋,请考虑显示starring our repository on GitHub的支持。您的ð将帮助我们吸引更多的开发人员并继续改善平台。