2023 年 9 月 28 日

边缘上的 SQLite:Prisma 对 Turso 的支持处于早期访问阶段

Turso 是一个基于 libSQLSQLite 的开源和开放贡献分支)的边缘托管分布式数据库,使您能够将数据更靠近您的应用程序并最大限度地减少查询延迟。

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

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

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

SQLite 是一个自包含的、基于文件的开源数据库,以其可移植性、可靠性和性能而闻名,即使在内存不足的环境中也是如此。由于其速度,它也是小型 Web 应用程序的完美选择。

然而,扩展 SQLite 引入了挑战

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

其中一些挑战可以通过诸如 LiteFS 等工具来解决,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 会自动选择离您的应用最近的副本进行读取查询。无需额外的逻辑来定义应如何处理读取查询的路由。写入查询将被转发到主数据库。

试用一下并分享您的反馈!如果您发现任何遗漏或遇到错误,我们鼓励您 创建一个 issue


超越远程 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 新闻通讯