什么是 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
功能标志是我们正在努力实现的驱动程序适配器计划的一部分,该计划使您可以使用其他数据库驱动程序来连接到您的数据库。示例驱动程序适配器包括 PlanetScale、Neon 和 libSQL。我们将很快分享更多详细信息!如果您还没有填写 此调查,并留下您的电子邮件地址以获取更新。
先决条件
您需要安装以下工具
如果您没有使用 SQLite 的现有项目,则可以使用 try-prisma
设置项目。导航到您的工作目录并复制以下命令以设置项目
导航到项目并在您首选的代码编辑器中打开它
在 Turso 上创建数据库
首先,在 Turso 上创建一个应用程序将使用的数据库。此步骤对于创建配置 Turso 数据库客户端所需的凭据是必要的。
-
要创建数据库,请在终端上运行以下命令
Turso 还将在离您位置最近的区域创建一个数据库。
-
创建一个身份验证令牌,该令牌将允许您连接到数据库
-
接下来,显示连接字符串详细信息以连接到您的数据库
记下身份验证令牌和连接字符串,它们将在下一步中用于连接到您的数据库。
使用 Prisma 连接到 Turso
要开始使用 Turso
-
在您的 Prisma 模式中启用
driverAdapters
预览功能标志 -
使用“在 Turso 上创建数据库”步骤中的值创建或更新您的
.env
文件,其中包含环境变量 -
创建初始迁移
-
将迁移应用于您的 Turso 数据库
-
安装最新版本的 Prisma 客户端
-
安装 libSQL 数据库客户端和 Prisma 客户端的驱动程序适配器
-
使用以下代码段更新您的 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.](/blog/posts/prisma-turso-ea-support/mind-blown.gif)
嵌入式副本如何工作?
当您的应用程序最初建立与数据库的连接时,远程主数据库将满足查询
![](/blog/posts/prisma-turso-ea-support/embedded-replica-remote-read.png)
然后,Turso 将 (1) 在您的应用程序内部创建一个嵌入式副本,并 (2) 将数据从您的主数据库复制到副本,以便在本地可用
![](/blog/posts/prisma-turso-ea-support/embedded-replica-create-copy.png)
嵌入式副本将满足后续的读取查询。 libSQL 客户端提供了一个 sync()
方法,您可以调用该方法以确保嵌入式副本的数据保持最新。
![](/blog/posts/prisma-turso-ea-support/embedded-replica-read.png)
通过嵌入式副本,此设置可保证您的应用程序速度快,因为数据将在本地轻松可用。
与您可能熟悉的读取副本设置类似,写入操作将转发到主远程数据库,并在传播到所有嵌入式副本之前执行。
![](/blog/posts/prisma-turso-ea-support/embedded-replica-write-propagation.png)
- 写入操作传播被转发到数据库。
- 数据库使用来自 1 的更新响应服务器。
- 写入操作传播到数据库副本。
嵌入式副本对您的查询的影响
为了演示嵌入式副本的速度,我们使用相同的主数据库创建了两个示例应用程序,其中一个变体使用嵌入式副本。
对于此示例测试,将使用以下查询
以下是应用程序启动时相同查询的计时屏幕截图
没有嵌入式副本
时间:154.390 毫秒
![](/blog/posts/prisma-turso-ea-support/remote-sqlite-timing.png)
有嵌入式副本
时间:7.883 毫秒
![](/blog/posts/prisma-turso-ea-support/embedded-replica-timing.png)
查询响应从 154.390 毫秒显着降至 7.883 毫秒。
如果您想亲自尝试,可以在 GitHub 上找到这两个示例应用程序
嵌入式副本可以用于什么?
嵌入式副本是 Turso 的一项相对较新的功能,您可以将其用于以下一些用例,包括:
- 提高 API 的读取性能:嵌入式副本可以通过使用带有 Prisma Client 的嵌入式数据库来消除连接到远程数据库服务器的网络开销。
- 替代您的缓存服务:嵌入式副本可以与 Prisma Client 扩展配对以用于查询响应,因为数据始终保持最新,从而使您的应用程序更快。
看到您为这种新的数据库副本方法提出哪些其他用例将会很有趣。
亲自尝试!
我们迫不及待地想看到您使用 Turso 和 Prisma 构建的内容。我们鼓励您尝试一下,并告诉我们您的想法。
我们还在努力支持其他无服务器数据库驱动程序和边缘函数部署。请填写这份简短的调查,并留下您的电子邮件地址以获取更新。
请务必在 Twitter 或 Discord 上与我们分享您构建的内容。🙌
不要错过下一篇文章!
注册 Prisma 时事通讯