将Prisma与Sveltekit一起使用
#javascript #网络开发人员 #database #svelte

数据是每个Web应用程序的关键部分。无论您是构建Sveltekit应用程序以捕获表单输入,可视化某些数据还是为用户提供仪表板,应用程序呼吸数据。

但是处理数据库可能具有挑战性。每个数据库都有自己的API略有不同。您需要编写大量数据库访问代码,并将数据库schemas保持最新。这项工作加起来了。

这就是为什么我喜欢Prisma,使用解决方案是一种友好的友好,可以简化使用数据库的许多痛点。

什么是Prisma?

prisma是一个ORM(对象相关映射器)。它可以帮助应用程序与数据库交谈。有点像您的JavaScript代码和基础数据库之间的中间人。

它可以从数据库中读取行,并将它们变成JavaScript对象(水合)。反之亦然,它可以采用JavaScript对象并更新您的数据库或创建新记录。它支持many types of databases

代码生成器

在Prisma中,模型(又称表)是在名为schema.prisma的文件中定义的。然后,您运行prisma generate为您的应用程序生成自定义客户端。

因此,您可以将Prisma视为一种代码生成器。

Prisma converts schema.prisma file into a client wrapper

模式同步

prisma通过同步更改使数据库模式保持最新。

它支持两种样式:

  • push:以这种风格,schema.prisma是真实源。可以轻松处理添加更改,例如添加新表或新列。这是在原型阶段推荐的方法。但这对于更复杂的更改不是理想的选择,例如更改数据类型。
  • migrate:在这种方法中,迁移脚本被视为真实源。它提供了对模式变化的细粒度控制。建议为生产应用程序使用。

Schema syncing diagram

设置

要在Sveltekit应用中安装Prisma,请运行:

pnpm install -D prisma @prisma/client

然后初始化项目:

pnpm prisma init

这做2件事

  1. 它创建了一个可以定义模型的prisma/schema.prisma
  2. 它将环境变量DATABASE_URL添加到.env

DATABASE_URL是连接信息Prisma需要连接到数据库。

例如,对于Postgres,它看起来像postgresql://USER:PASSWORD@HOST:PORT/DATABASE

有关示例的完整列表,请参见Supported Connection URLs

起点

对于新应用程序,Prisma模式是从头开始编写的,但Prisma也支持导入现有的旧数据库模式。

要从现有数据库开始

要从新数据库开始,在prisma/schema.prisma中定义模型和Prisma将为您同步数据库架构。

造型

这是模型和索引的一些示例。

定义基本模型:

// in prisma/schema.prisma
model Product {
}

可以以name DataType的格式添加字段:

model Product {
  // auto-incrementing primary key
  id Int @id @default(autoincrement())
  barcode String
  name String
}

添加索引:

model Product {
  // ...

  // define a unique index
  @@unique([barcode])

  // define a non-unique index
  @@index([name])
}

有关更多示例,请参见docs on modelling或我在Svelte + Prisma上的课程。

同步数据库

要更新数据库架构,运行:

pnpm prisma db push

注意:在某些情况下,可能会发生冲突。例如,如果字段的数据类型从String更改为Int,则没有自动方法来调和转换。 Prisma会通知您存在冲突,并为您提供重置表(导致数据丢失)的选项,或者您可以使用迁移进行更多控制。

浏览数据库

Prisma带有一个方便的数据库查看器,该查看器在浏览器中运行。这是在开发过程中检查数据库表的有用工具。

这是一个屏幕截图:

Screenshot of Prisma Studio

要查看它,运行:

pnpm prisma studio

然后访问https://localhost:5555

访问数据库

您应用程序中的许多地方可能需要访问数据库。因此,将DB客户端集中是一个好主意。

为此,创建一个称为src/lib/db.server.js的文件并实例化客户端:

import { PrismaClient } from '@prisma/client'

// expose a singleton
export const db = new PrismaClient()

现在,任何时候都需要连接,导入lib/db.server.js

// import the centralized connection
import { db } from '$lib/db.server'

// then do stuff with the db connection
db.model.create(...)
db.model.update(...)
db.model.findMany(...)
// etc...

注意:很少需要手动断开连接,因为Prisma在过程结束时会自动关闭连接。

播种数据

当应用程序使用种子数据集汇票时,设置开发器机器要容易得多。它还使重置环境时更容易。

在Prisma中,种子数据是在prisma/seed.js中定义的。

这是一个示例:

// in prisma/seed.js

// import db client from previous step
import { db } from '$lib/db.server'

// create one record
await db.product.create({
  data: { barcode: '1234', name: 'Shirt' }
})

// or create records in bulk
await db.product.createMany({
  data: [
    { barcode: '5678', name: 'Pants' },
    { barcode: '91011', name: 'Socks' }
  ]
})

然后将prisma部分添加到package.json

"prisma": {
  "seed": "vite-node ./prisma/seed.js"
}

注意:使用vite-node代替node,因为我们的seed.js导入a vite 别名$lib。因此,请确保也安装vite-node

pnpm install -D vite-node

然后加载种子数据:

pnpm prisma db seed

结论

Prisma是将Sveltekit项目与数据库连接的绝佳选择。

Prisma处理所有棘手的内容,例如同步数据库模式并生成SQL查询,因此您不必手动执行此操作。

它可以使开发人员的时间专注于建筑功能。

P.S。有关Sveltekit/Prisma Repo的更多示例,请参见joshnuss/markdown-mail