为什么Prisma和Platformatic是一场很棒的比赛
#node #database #prisma #migrations

Platformatic是一种新工具,可帮助Node.js开发人员更快地运送API。在这个三部分的系列中,我们将探讨为什么Prisma和Platformatic如此适合,以及Prisma如何帮助您改善您的数据建模,迁移和使用Platformatic时查询工作流程。

什么是平台DB

Platformatic DB是一种开源工具,可自动为您的数据库生成CRUD API。它支持GraphQL和REST(带有OpenAPI模式)API。

它还允许您使用plugins扩展API,并添加身份验证以及授权您的API。平台数据库支持SQLITE,MYSQL,MARIADB和POSTGRESQL数据库。

什么是Prisma

Prisma是一个开源ORM(对象关系映射器)。它提供了一种使用Prisma schema language定义数据库结构的声明性方法。它还提供了通过自动生成完全可定制的SQL迁移来发展数据库模式的工具。

Prisma提供了一个类型和直观的客户端,用于与您的数据库进行交互,称为Prisma Client

Prisma如何通过平台DB改善您的开发工作流程

虽然平台上可以从数据库中加速构建REST和GRAPHQL API,但Prisma可以通过多种方式补充您的开发工作流程。

在以下各节中,我们将探讨Prisma使使用平台DB的三种具体方式。

直观数据建模语言

Prisma提供了Prisma架构 - 对数据库模式的直观,可读性的声明性定义。 Prisma模式通过描述其所需的最终状态来充当您数据库模式的真实源。

使用PRISMA模式的好处之一是自动完成,借助Prisma扩展,在建模数据库模式时进行类型检查,使您能够尽早发现错误。

以下模式表示:

  • UserPost模型
  • UserPost模型之间的一对多关系
model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  name      String?
  email     String   @unique

  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  title     String
  content   String
  published Boolean  @default(false)

  author    User?    @relation(fields: [authorId], references: [id])
  authorId  Int?
}

请参阅Prisma docs以了解有关数据建模的更多信息。

自动生成和可自定义的SQL迁移

要使用Platformatic生成API,您必须首先定义数据库架构。数据库架构是在一组手动编写的迁移文件中使用SQL定义的。但是,通过手动保持SQL迁移可能很乏味,易碎且容易出错。

我还认为写自己的迁移会引入用户错误的风险,例如忘记创建外键。

Kishan Gajera来自Generate Up and Down Migrations for Platformatic DB using Prisma

编辑器通常在使用SQL时不提供自动完成和类型检查。这可能使发现错误等错误(例如外国键)等错误。

prisma可以通过使用CLI的定义模式生成完全可抑制的迁移来帮助自动化此过程。

将根据previous section中的模式生成以下SQL迁移:

-- CreateTable
CREATE TABLE "User" (
    "id" SERIAL NOT NULL,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "email" TEXT NOT NULL,
    "name" TEXT,

    CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Post" (
    "id" SERIAL NOT NULL,
    "title" VARCHAR(255) NOT NULL,
    "content" TEXT NOT NULL,
    "published" BOOLEAN NOT NULL DEFAULT false,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "authorId" INTEGER,

    CONSTRAINT "Post_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

-- AddForeignKey
ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;

数据库查询的类型安全和自动完成

Platformatic提供用于扩展API的plugins。它还提供了一个用于查询数据库的SQL mapper

除了开箱即用的SQL映射器外,您还可以使用Prisma客户端扩展平台API来查询数据库。 Prisma Client提供基于您的Prisma架构的丰富类型定义的完全类型安全查询。

Platformatic还提供打字稿支持。您可以从数据库中使用CLI到generate TypeScript types进行实体。

如果您正在使用VS代码编辑器,则VS代码的Intellisense和建议在定义查询时会弹出。

Prisma VS Code intellisense

此外,VS代码还可以运行您的JavaScript文件,该文件使用Prisma客户端通过Typescript编译器并在违反类型时抛出错误。

Prisma VS Code type validation

了解更多信息,您可以在this article中使用JSDOC编写类型安全JavaScript

包起来

平台速度加快了REST和GRAPHQL API的开发。 Prisma通过提供直观的数据建模,自动生成可定制的迁移,类型安全和自动完成来进一步推动开发体验。

请注意第2部分和第3部分建模,自动生成数据库迁移,并使用Prisma Client使用Prisma Client进行平台的插件扩展API。 ðÖ¾