什么是 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 模式中启用
driverAdapters预览功能标志 -
创建或更新您的
.env文件,其中包含“在 Turso 上创建数据库”步骤中的环境变量值 -
创建初始迁移
-
将迁移应用到您的 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 会构建出什么。我们鼓励您尝试一下并告诉我们您的想法。
我们还在努力支持其他无服务器数据库驱动程序和边缘函数部署。请完成这项简短调查,并留下您的电子邮件地址以获取更新。
请务必在 X/Twitter 或 Discord 上与我们分享您的作品。🙌
不要错过下一篇文章!
订阅 Prisma 新闻通讯