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
功能标志是我们正在努力的驱动适配器计划的一部分,旨在使您能够使用其他数据库驱动连接到您的数据库。示例驱动适配器包括 PlanetScale、Neon 和 libSQL。我们将很快分享更多细节!如果您尚未完成,请填写此调查,并留下您的电子邮件地址以获取更新。
先决条件
您需要安装以下工具
如果您没有现有使用 SQLite 的项目,可以使用 try-prisma
设置一个项目。导航到您的工作目录并复制以下命令来设置项目
导航到项目并在您首选的代码编辑器中打开它
在 Turso 上创建数据库
首先,在 Turso 上创建一个您的应用程序将使用的数据库。此步骤对于创建配置 Turso 数据库客户端所需的凭据至关重要。
-
要创建数据库,请在您的终端中运行以下命令
Turso 还会在离您最近的区域创建一个数据库。
-
创建一个身份验证令牌,它将允许您连接到数据库
-
接下来,显示连接字符串详细信息以连接到您的数据库
请记下身份验证令牌和连接字符串,它们将在下一步中用于连接到您的数据库。
使用 Prisma 连接到 Turso
开始使用 Turso
-
在您的 Prisma schema 中启用
driverAdapters
预览功能标志 -
使用“在 Turso 上创建数据库”步骤中的值创建或更新您的
.env
文件 -
创建初始迁移
-
将迁移应用到您的 Turso 数据库
-
安装最新版本的 Prisma Client
-
安装 libSQL 数据库客户端和 Prisma Client 的驱动适配器
-
使用以下代码片段更新您的 Prisma Client 实例
就是这样!
您现在可以使用 Prisma Client 开始查询您的 Turso 数据库了。
如果您克隆了 typescript/script
示例,您可以运行 npm run dev
来插入和查询数据,以确认您的更改已成功。
接下来做什么
上述设置使用一个单个远程数据库。您可以通过设置数据库副本来进一步。当您创建副本时,Turso 会自动为读取查询选择离您的应用程序最近的副本。无需额外的逻辑来定义读取查询的路由方式。写入查询将转发到主数据库。
尝试一下并分享您的反馈!如果您发现任何缺失或遇到错误,我们鼓励您创建问题。
超越远程 SQLite:嵌入式副本
虽然 Turso 允许您在全球范围内复制 SQLite,但如果您能消除从应用程序到远程副本的额外网络跳跃呢?如果……您可以将数据库移动到应用程序内部呢?
借助 Turso 新发布的嵌入式副本,您可以在应用程序内部拥有主远程数据库的副本,类似于嵌入式/本地 SQLite 数据库的工作方式。您可以使用 Prisma 对 Turso 的新支持在您的应用程序中尝试此功能。

嵌入式副本如何工作?
当您的应用程序首次与数据库建立连接时,远程主数据库将执行查询

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

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

通过嵌入式副本,这种设置保证了您的应用程序速度快,因为数据将在本地随时可用。
与您可能熟悉的读取副本设置类似,写入操作会转发到远程主数据库并执行,然后传播到所有嵌入式副本。

- 写入操作的传播被转发到数据库。
- 数据库将步骤 1 中的更新响应给服务器。
- 写入操作传播到数据库副本。
嵌入式副本对查询的影响
为了展示嵌入式副本的速度,我们创建了两个使用相同主数据库的示例应用程序——其中一个变体使用了嵌入式副本。
对于此示例测试,将使用以下查询
以下是应用程序启动时相同查询的计时截图
不使用嵌入式副本
时间:154.390 毫秒

使用嵌入式副本
时间:7.883 毫秒

查询响应时间从 154.390 毫秒显著下降到 7.883 毫秒。
如果您想亲自尝试,可以在 GitHub 上找到这两个示例应用程序
嵌入式副本有什么用?
嵌入式副本是 Turso 的一个相对较新的功能,但您可以使用它们的一些用例包括:
- 提高 API 的读取性能:嵌入式副本可以通过 Prisma Client 将嵌入式数据库连接到您的应用程序,从而消除连接到远程数据库服务器的网络成本。
- 替代您的缓存服务:嵌入式副本可以与 Prisma Client 扩展配对以进行查询响应,使您的应用程序更快,因为数据始终保持最新。
这种新的数据库副本方法将带来哪些其他用例,我们拭目以待。
亲自尝试一下!
我们迫不及待地想看到您使用 Turso 和 Prisma 构建什么。我们鼓励您亲自尝试并告诉我们您的想法。
我们还在努力支持其他无服务器数据库驱动和边缘函数部署。请完成这份简短的调查,并留下您的电子邮件地址以获取更新。
请务必在 Twitter 或 Discord 上与我们分享您的作品。🙌
不要错过下一篇文章!
订阅 Prisma 新闻通讯