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 解决了上述挑战 — 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. 创建或更新你的 .env 文件,将 Turso 数据库创建步骤中的值填入环境变量

  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 ms

使用嵌入式副本

时间:7.883 ms

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

如果你想自己尝试一下,可以在 GitHub 上找到这两个示例应用程序

你可以用嵌入式副本做什么?

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

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

看看你会为这种新的数据库副本方法提出什么其他用例,这将非常有趣。

亲自试一试!

我们迫不及待地想看看你将用 Turso 和 Prisma 构建什么。我们鼓励你尝试一下并 告诉我们你的想法

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

请务必在 TwitterDiscord 上分享你构建的内容。🙌

不要错过下一篇文章!

订阅 Prisma 新闻通讯