2023 年 9 月 28 日

边缘上的 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 解决了上述挑战,它是 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 模式中启用 driverAdapters 预览功能标志

  2. 使用“在 Turso 上创建数据库”步骤中的值创建或更新您的 .env 文件,其中包含环境变量

  3. 创建初始迁移

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

  5. 安装最新版本的 Prisma 客户端

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

  7. 使用以下代码段更新您的 Prisma 客户端实例

就是这样!

您现在可以使用 Prisma 客户端开始查询您的 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 时事通讯