使用 Prisma ORM 和 Cloudflare D1 构建应用程序

自 2017 年推出 Workers 以来,Cloudflare 一直引领边缘计算领域。Cloudflare 最近通过 D1 发布了本机无服务器数据库。我们现在可以使用 Prisma ORM 与 D1 一起构建应用程序。

将数据库部署到边缘

Cloudflare Workers 是一种分布在全球范围内的轻量级无服务器计算形式。它们允许您尽可能靠近最终用户部署和运行应用程序。

D1 是 Cloudflare 用于边缘环境的本机无服务器数据库,它基于 SQLite,可在通过 Cloudflare 部署应用程序时使用。D1 最初于 2022 年推出。

遵循 Cloudflare 的地理分布原则并使计算和数据更接近应用程序用户,D1 支持自动读取复制,它根据数据库获取的查询数量和来自数据库的查询数量,来动态管理数据库实例的数量和只读副本的位置。

这意味着读取查询是针对最接近发出查询的位置的 D1 实例执行的。

虽然您也可以将 Prisma ORM 与其他数据库提供商一起使用只读副本,但这通常需要您使用只读副本客户端扩展。使用 D1 时,开箱即用地支持只读副本,无需专用的客户端扩展。

另一方面,对于写入操作,查询仍然会传输到单个主实例,以便将更改传播到所有读取副本并确保数据一致性。

Prisma ORM 支持 D1

在 Prisma,我们相信 Cloudflare 处于构建应用程序构建和部署方式未来的最前沿。支持 D1 一直是 GitHub 上 Prisma ORM 最受欢迎的功能请求之一。

作为 Cloudflare 作为技术提供商的坚定拥护者,我们很高兴与大家分享,您现在可以在 Cloudflare Workers(和 Pages)内使用 Prisma ORM 来访问 D1 数据库。

请注意,此功能基于当前处于预览版的驱动程序适配器,因此我们认为 D1 支持也处于预览版。

Prisma ORM 和 D1 入门

在下文中,您将找到设置和部署带有 D1 数据库的 Cloudflare Worker 的分步说明,该数据库完全从头开始通过 Prisma ORM 访问。

截至此版本,Prisma Migrate 尚未与 D1 完全兼容。在本教程中,您将结合使用 D1 的迁移系统和 prisma migrate diff 命令来生成并运行迁移。

先决条件

  • 已安装 Node.js 和 npm
  • 一个 Cloudflare 帐户

创建 Cloudflare Worker

第一步,继续使用 npm create 引导普通版本的 Cloudflare Worker(使用 Cloudflare 的 hello-world 模板)。在终端中运行以下命令:

npm create cloudflare@latest prisma-d1-example -- --type hello-world

这将打开一个 CLI 向导,每次出现问题时按回车键选择所有默认选项。

在向导结束时,您应该在域 https://prisma-d1-example.USERNAME.workers.dev 中部署了一个 Cloudflare Worker,它只是在浏览器中呈现「Hello World」:

初始化 Prisma ORM

当您的 Worker 就位后,让我们继续设置 Prisma ORM。首先,导航到项目目录并安装 Prisma CLI:

cd prisma-d1-example
npm install prisma --save-dev

接下来,安装 Prisma 客户端包以及 D1 的驱动程序适配器:

npm install @prisma/client
npm install @prisma/adapter-d1

最后,使用以下命令引导 Prisma ORM 所需的文件:

npx prisma init --datasource-provider sqlite

这个命令做了两件事:

  1. 它创建了一个名为 prisma 的新目录,其中包含您的 Prisma 架构文件
  2. 它创建了一个 .env 文件,该文件通常用于配置 Prisma CLI 读取的环境变量

在本教程中,您不需要 .env 文件,因为 Prisma ORM 和 D1 之间的连接将通过绑定进行。您将在下一步中找到有关设置此绑定的说明。

由于您将使用当前处于预览版的驱动程序适配器功能,因此您需要通过 generator 块上的 previewFeatures 字段显式启用它。

打开 schema.prisma 文件并调整 generator 块,如下所示:

generator client {provider        = "prisma-client-js"previewFeatures = ["driverAdapters"]
}

创建 D1 数据库

在此步骤中,您将设置 D1 数据库,通常有两种方法:使用 Cloudflare 仪表板 UI 或通过 wrangler CLI。您将在本教程中使用 CLI。

打开终端并运行以下命令:

npx wrangler d1 create prisma-demo-db

如果一切顺利,您应该看到类似以下的输出:

✅ Successfully created DB 'prisma-demo-db' in region EEUR
Created your database using D1's new storage backend. The new storage backend is not yet recommended for production workloads, but backs up your data via
point-in-time restore.[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "prisma-demo-db"
database_id = "__YOUR_D1_DATABASE_ID__"

现在,您的 Cloudflare 帐户中有一个 D1 数据库,并绑定到您的 Cloudflare Worker。

复制命令输出的最后一部分并将其粘贴到 wrangler.toml 文件中。它应该类似于:

name = "prisma-d1-example"
main = "src/index.ts"
compatibility_date = "2024-03-20"
compatibility_flags = ["nodejs_compat"][[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "prisma-demo-db"
database_id = "__YOUR_D1_DATABASE_ID__"

请注意,上面代码片段中的 __YOUR_D1_DATABASE_ID__ 是一个占位符,应替换为您自己的 D1 实例的数据库 ID。如果您无法从终端输出中获取此 ID,您还可以在 Cloudflare 仪表板中或通过在终端中运行 npx wrangler d1 info prisma-demo-db 来找到它。

接下来,您将在数据库中创建一个数据库表,以便能够使用 Prisma ORM 向 D1 发送一些查询。

在数据库中创建表

D1 通过 wrangler d1 migrate 命令自带了自己的迁移系统。该迁移系统与 Prisma CLI 完美配合,Prisma CLI 提供的工具允许您为架构更改生成 SQL 语句。所以你可以:

  • 使用 D1 的本机迁移系统创建迁移文件并将其应用到您的 D1 实例
  • 使用 Prisma CLI 为任何架构更改生成 SQL 语句

接下来,您将使用 D1 的迁移系统和 Prisma CLI 针对数据库创建和运行迁移。首先,使用 wrangler CLI 创建新的迁移:

npx wrangler d1 migrations create prisma-demo-db create_user_table

当提示该命令是否可以创建名为 migrations 的新文件夹时,请按回车进行确认。接下来,您需要将创建 User 表的 SQL 语句添加到该文件中。打开 schema.prisma 文件并向其中添加以下 User 模型:

model User {id    Int     @id @default(autoincrement())email String  @uniquename  String?
}

现在,在终端中运行以下命令来生成 SQL 语句,该语句创建与上面的 User 模型等效的 User 表:

npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script > migrations/0001_create_user_table.sql

这会存储一条 SQL 语句,用于在之前的迁移文件中创建一个新的 User 表。

在本教程中,您将同时执行这两项操作:在本地测试 Worker,然后进行部署。因此,您需要运行这两个命令。打开终端并粘贴以下命令。

首先,对本地数据库执行架构更改:

npx wrangler d1 migrations apply prisma-demo-db --local

接下来,针对远程数据库:

npx wrangler d1 migrations apply prisma-demo-db --remote

当系统提示您确认是否应应用迁移时,请两次按回车键。您的本地和远程 D1 实例现在都包含 User 表。

我们还创建一些虚拟数据,以便在 Worker 运行后进行查询。这次,您将运行 SQL 语句而不将其存储在文件中。

针对本地数据库运行命令:

npx wrangler d1 execute prisma-demo-db --command "INSERT INTO  \"User\" (\"email\", \"name\") VALUES 
('jane@prisma.io', 'Jane Doe (Local)');" --local

针对远程数据库运行命令:

npx wrangler d1 execute prisma-demo-db --command "INSERT INTO  \"User\" (\"email\", \"name\") VALUES 
('jane@prisma.io', 'Jane Doe (Remote)');" --remote

现在,您的本地和远程数据库实例中都有一条虚拟记录。您可以在 .wrangler/state 中找到本地 SQLite 文件,而可以在 Cloudflare 仪表板中检查远程文件。

从 Worker 查询数据库

为了使用 Prisma ORM 从 Worker 查询数据库,您需要:

  1. 将 DB 添加到 Env 接口
  2. 使用 PrismaD1 驱动程序适配器实例化 PrismaClient
  3. 使用 Prisma 客户端发送查询并返回结果

打开 src/index.ts 并将整个内容替换为以下内容:

import { PrismaClient } from '@prisma/client'
import { PrismaD1 } from '@prisma/adapter-d1'export interface Env {DB: D1Database
}export default {async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {const adapter = new PrismaD1(env.DB)const prisma = new PrismaClient({ adapter })const users = await prisma.user.findMany()const result = JSON.stringify(users)return new Response(result);},
};

在运行 Worker 之前,需要使用 npx prisma generate 命令生成 Prisma Client。

本地运行 Worker

数据库查询到位并生成 Prisma 客户端后,您可以使用 npm run dev 继续在本地运行 Worker。现在您可以打开浏览器 http://localhost:8787 来查看数据库查询的结果:

[{"id":1,"email":"jane@prisma.io","name":"Jane Doe (Local)"}]

部署 Worker

要部署 Worker,请运行命令 npm run deploy

和以前一样,您部署的 Worker 可以通过 https://prisma-d1-example.USERNAME.workers.dev 访问。如果您将浏览器导航到该 URL,您应该会看到从远程 D1 数据库查询的以下数据:

恭喜,您刚刚部署了一个使用 D1 作为数据库的 Cloudflare Worker 并通过 Prisma ORM 查询它 🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7安装Docker与Docker-compose【图文教程】

个人记录 查看一下系统是否已经安装了Docker yum list installed | grep docker如下图代表没有安装Docker 卸载已有Docker yum remove docker docker-common docker-selinux docker-engine切换目录 cd /etc/yum.repos.d/查看当前目录所有的镜像源 ll安装yum-util与devi…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…

C语言-realloc函数的使用

语法格式 1. realloc 函数用于动态地改变之前分配的内存块的大小。其函数原型如下&#xff1a; void *realloc(void *ptr, size_t size);- ptr: 指向之前分配的内存块的指针。如果 ptr 为 NULL&#xff0c;那么 realloc 行为与 malloc 相同。 - size: 新分配的大小&#xff0…

前端三剑客 —— CSS (上)

上节内容中提到了 前端三剑客 —— HTML 超文本标记语言&#xff0c;这节内容 跟大家讲述三剑客中的第二个 CSS。 CSS 什么是CSS Cascading Style Sheel&#xff0c;简称CSS&#xff0c;中文叫层叠样式表&#xff0c;也叫级联样式表。主要作用是来修饰HTML页面的一种技术。 …

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型&#xff0c;该模型言简意赅&#xff0c;但是但从论文理解&#xff0c;有很多细节都不清楚&#xff0c;尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关&#xff0c;本文将根据代码详…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读&#xff08;非常推荐&#xff09; Generating Mammography Reports from Multi-view Mammograms with BERT&#xff08;上&#xff09; 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

基于单片机的数字万用表设计

**单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…

【性能测试】接口测试各知识第2篇:学习目标,1. 理解接口的概念【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

ChatGPT 的行家指南

原文&#xff1a;An Insider’s Guide to using ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 你是否厌倦了花费无数小时为你的业务创建内容&#xff1f;从博客文章到社交媒体更新&#xff0c;从电子书内容到电子邮件&#xff0c;这可能是一个耗时的过…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

基于java+SpringBoot+Vue的学生心理咨询评估系统设计与实现

基于javaSpringBootVue的学生心理咨询评估系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 后台展示 用户管理模块&#xff1a;管理员可以查看、添加、编辑和删除用户信息。 试题管理模块&#xff1a…

Qt + VS2017 创建一个简单的图片加载应用程序

简介&#xff1a; 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片&#xff0c;并保存用户上次选择的图片路径。 1. 创建项目&#xff1a; 首先&#xff0c;在VS中创建一个新的Qt Widgets应用程序项目&#xff0c;并…

LeetCode 1379.找出克隆二叉树中的相同节点:二叉树遍历

【LetMeFly】1379.找出克隆二叉树中的相同节点&#xff1a;二叉树遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0…

Golang | Leetcode Golang题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; func lengthOfLongestSubstring(s string) int {// 哈希集合&#xff0c;记录每个字符是否出现过m : map[byte]int{}n : len(s)// 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左侧&#xff0c;还没有开始移动r…

CMD 命令行进入到电脑硬盘的某个目录的几种方式

本文介绍几种 cmd 命令行进入到电脑硬盘的某个目录的几种方式。 1、在具体文件目录地址栏输入 cmd 回车 这是最快的、最牛的方式&#xff0c;没有之一。 比如&#xff1a;我想进入一个层级很深的文件目录&#xff0c;直接打开在那个目录&#xff0c;把地址栏信息删除清空&am…

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

【C++进阶】带你手撕红黑树(红与黑的爱恨厮杀)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 引言&#xff1a; 之前我们…

vivado 串行矢量格式 (SVF) 文件编程

串行矢量格式 (SVF) 文件编程 注释 &#xff1a; 串行矢量格式 (SVF) 编程在 Versal ™ 器件上不受支持。 对 FPGA 和配置存储器器件进行编程的另一种方法是通过使用串行矢量格式 (SVF) 文件来执行编程。通过 Vivado Design Suite 和 Vivado Lab Edition 生成的 SVF …