2023 年 9 月 28 日

Edge 上的 SQLite:Prisma 对 Turso 的支持已进入早期访问阶段

Turso 是一个基于 libSQL 的边缘托管分布式数据库,libSQL 是 SQLite 的一个开源、开放贡献的分支,它能让数据更接近您的应用程序,从而最大程度地减少查询延迟。

我们很高兴地宣布,Prisma ORM 正在添加对 Turso 的早期访问支持。让我们深入了解一下!

SQLite on the Edge: Prisma Support for Turso is in Early Access

Turso 是什么?它与 SQLite 有何不同?

SQLite 是一个独立的、基于文件的开源数据库,以其可移植性、可靠性和性能而闻名,即使在内存较低的环境中也表现出色。由于其速度,它也是小型 Web 应用程序的完美选择。

然而,扩展 SQLite 带来了挑战

  • 手动备份
  • 缺乏开箱即用的复制功能
  • 在无服务器环境中持久化数据的困难
  • 在多服务器设置中托管的困难

其中一些挑战可以通过诸如 LiteFS 之类的工具来解决,它为 SQLite 提供了复制和数据库备份功能。

另一方面,Turso 通过创建 libSQL 解决了上述挑战 — libSQL 是 SQLite 的一个分支,添加了 SQLite 尚未支持的功能。libSQL 允许您分发和复制 SQLite,通过 HTTP 连接,执行异步操作,并将 SQLite 作为主要数据库或主要数据库的副本嵌入到其他程序中。

Prisma + Turso = 🚀

虽然 Prisma 自 2019 年首次发布以来一直支持 SQLite,但 libSQL 与 SQLite 有所不同。例如,libSQL 使用 HTTP 连接到数据库并使用远程文件而非本地文件,这使得 Prisma 和 Turso 迄今为止都不兼容。

今天,我们很高兴地宣布,Prisma 对 Turso 的支持现已进入早期访问阶段!

开始使用 Prisma 和 Turso

要在您的项目中开始使用 Turso,您必须首先启用 driverAdapters 预览功能标志。这将允许您使用 Turso 的驱动适配器查询您的数据库。

driverAdapters 功能标志是我们正在努力的驱动适配器计划的一部分,旨在使您能够使用其他数据库驱动连接到您的数据库。示例驱动适配器包括 PlanetScaleNeon 和 libSQL。我们将很快分享更多细节!如果您尚未完成,请填写此调查,并留下您的电子邮件地址以获取更新。

先决条件

您需要安装以下工具

如果您没有现有使用 SQLite 的项目,可以使用 try-prisma 设置一个项目。导航到您的工作目录并复制以下命令来设置项目

导航到项目并在您首选的代码编辑器中打开它

在 Turso 上创建数据库

首先,在 Turso 上创建一个您的应用程序将使用的数据库。此步骤对于创建配置 Turso 数据库客户端所需的凭据至关重要。

  1. 要创建数据库,请在您的终端中运行以下命令

    Turso 还会在离您最近的区域创建一个数据库。

  2. 创建一个身份验证令牌,它将允许您连接到数据库

  3. 接下来,显示连接字符串详细信息以连接到您的数据库

    请记下身份验证令牌和连接字符串,它们将在下一步中用于连接到您的数据库。

使用 Prisma 连接到 Turso

开始使用 Turso

  1. 在您的 Prisma schema 中启用 driverAdapters 预览功能标志

  2. 使用“在 Turso 上创建数据库”步骤中的值创建或更新您的 .env 文件

  3. 创建初始迁移

  4. 将迁移应用到您的 Turso 数据库

  5. 安装最新版本的 Prisma Client

  6. 安装 libSQL 数据库客户端和 Prisma Client 的驱动适配器

  7. 使用以下代码片段更新您的 Prisma Client 实例

就是这样!

您现在可以使用 Prisma Client 开始查询您的 Turso 数据库了。

如果您克隆了 typescript/script 示例,您可以运行 npm run dev 来插入和查询数据,以确认您的更改已成功。

接下来做什么

上述设置使用一个单个远程数据库。您可以通过设置数据库副本来进一步。当您创建副本时,Turso 会自动为读取查询选择离您的应用程序最近的副本。无需额外的逻辑来定义读取查询的路由方式。写入查询将转发到主数据库。

尝试一下并分享您的反馈!如果您发现任何缺失或遇到错误,我们鼓励您创建问题


超越远程 SQLite:嵌入式副本

虽然 Turso 允许您在全球范围内复制 SQLite,但如果您能消除从应用程序到远程副本的额外网络跳跃呢?如果……您可以将数据库移动到应用程序内部呢?

借助 Turso 新发布的嵌入式副本,您可以在应用程序内部拥有主远程数据库的副本,类似于嵌入式/本地 SQLite 数据库的工作方式。您可以使用 Prisma 对 Turso 的新支持在您的应用程序中尝试此功能。

A meme gif of a person having their mind blown.

嵌入式副本如何工作?

当您的应用程序首次与数据库建立连接时,远程主数据库将执行查询

然后 Turso 将 (1) 在您的应用程序内部创建一个*嵌入式副本*,并 (2) 将数据从主数据库复制到该副本,使其在本地可用

嵌入式副本将满足后续的读取查询。libSQL 客户端提供了一个 sync() 方法,您可以调用它以确保嵌入式副本的数据保持最新。

通过嵌入式副本,这种设置保证了您的应用程序速度快,因为数据将在本地随时可用。

与您可能熟悉的读取副本设置类似,写入操作会转发到远程主数据库并执行,然后传播到所有嵌入式副本。

  1. 写入操作的传播被转发到数据库。
  2. 数据库将步骤 1 中的更新响应给服务器。
  3. 写入操作传播到数据库副本。

嵌入式副本对查询的影响

为了展示嵌入式副本的速度,我们创建了两个使用相同主数据库的示例应用程序——其中一个变体使用了嵌入式副本。

对于此示例测试,将使用以下查询

以下是应用程序启动时相同查询的计时截图

不使用嵌入式副本

时间:154.390 毫秒

使用嵌入式副本

时间:7.883 毫秒

查询响应时间从 154.390 毫秒显著下降到 7.883 毫秒

如果您想亲自尝试,可以在 GitHub 上找到这两个示例应用程序

嵌入式副本有什么用?

嵌入式副本是 Turso 的一个相对较新的功能,但您可以使用它们的一些用例包括:

  • 提高 API 的读取性能:嵌入式副本可以通过 Prisma Client 将嵌入式数据库连接到您的应用程序,从而消除连接到远程数据库服务器的网络成本。
  • 替代您的缓存服务:嵌入式副本可以与 Prisma Client 扩展配对以进行查询响应,使您的应用程序更快,因为数据始终保持最新。

这种新的数据库副本方法将带来哪些其他用例,我们拭目以待。

亲自尝试一下!

我们迫不及待地想看到您使用 Turso 和 Prisma 构建什么。我们鼓励您亲自尝试并告诉我们您的想法

我们还在努力支持其他无服务器数据库驱动和边缘函数部署。请完成这份简短的调查,并留下您的电子邮件地址以获取更新。

请务必在 TwitterDiscord 上与我们分享您的作品。🙌

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . All rights reserved.