Astro DB
Astro DB 是一款专为 Astro 设计的全托管 SQL 数据库。你可以在本地开发或者连接到我们 Astro Studio 平台上托管的数据库。
安装
段落标题 安装使用 @astrojs/db
集成(v0.8.1
或更高版本)来将 Astro DB 添加到新的或现有的 Astro 项目中(需要 astro@4.5
或更高版本)。Astro 包含一个内置的 astro add
命令能帮你自动化设置此过程。
如果你愿意,也可以手动安装 @astrojs/db
。
定义你的数据库
段落标题 定义你的数据库Astro DB 是一个用于配置、开发和查询你的数据的完整解决方案。每当你运行 astro dev
时,都会创建一个本地数据库,并使用 libSQL 来管理你的数据,而无需 Docker 或网络连接。
使用 astro add
命令安装 @astrojs/db
将在你的项目中创建一个 db/config.ts
文件,你将在其中定义你的数据库表:
Astro DB 中的数据是通过 SQL 表存储的。表将你的数据结构化为行和列,其中列强制每行值的类型。
当你定义一个表时,Astro 将为你的项目生成一个 TypeScript 接口来查询该表。这意味着当你访问数据时,将获得完整的 TypeScript 支持,包括属性自动完成和类型检查。
要配置数据库表,应从 astro:db
导入并使用 defineTable()
和 column
工具。
这个例子配置了一个 Comment
表,它有 author
和 body
的必需文本列。然后,通过 defineDb()
导出使其在你的项目中可用。
Astro DB 支持以下列类型:
表引用
段落标题 表引用表之间的关系是数据库设计中的常见架构。例如,一个 Blog
表可能与 Comment
、Author
和 Category
等其他几个表密切相关。
你可以使用引用列定义来这些表之间的关系并将它们保存到你的数据库中。要建立关系,你需要:
- 在被引用的表上有一个标识符列。这通常是带有
primaryKey
属性的id
列。 - 在基础表上有一个用于存储被引用
id
的列。这将使用references
属性来建立关系。
这个例子显示了一个 Comment
表的 authorId
列引用了 Author
表的 id
列。
为你的数据库填充数据
段落标题 为你的数据库填充数据在开发过程中,Astro 将使用你的 DB 配置并根据你的架构生成本地类型。这些内容将在每次启动开发服务器时重新生成,并允许你使用类型安全和自动补全来查询和处理你的数据样例。
要为你的 Astro 项目填充开发数据进行测试和调试,你需要创建一个 db/seed.ts
文件。从 astro:db
导入 db
对象和任何配置的表,然后使用 db.insert()
函数提供一个表行数据对象的数组。
以下例子为 Comment
表定义了两行开发数据:
你的开发服务器将在此文件更改时自动重启你的数据库,然后重新生成你的类型并从 seed.ts
填充你的开发数据。
查询你的数据库
段落标题 查询你的数据库你可以从项目中的任何 Astro 页面 或 端点 使用提供的 db
ORM 和查询构建器来查询你的数据库。
Drizzle ORM
段落标题 Drizzle ORMAstro DB 包含一个内置的 Drizzle ORM 客户端。使用该客户端无需设置或手动配置。当你运行 Astro 时,Astro DB 的 db
客户端会自动配置以与你的数据库(本地或远程)进行通信。它使用你明确的数据库架构定义进行类型安全的 SQL 查询,当你引用不存在的列或表时,会出现 TypeScript 错误。
查询
段落标题 查询以下例子选择了 Comment
表的所有行。这将返回来自 db/seed.ts
全量的填充的开发数据数组,然后可以在你的页面模板中使用它们:
select()
API 参考 以获取完整概述。
插入
段落标题 插入要接受用户输入,如处理表单请求并将数据插入到你的远程托管数据库,需要为你的 Astro 项目配置 按需渲染 并为你的部署环境 添加一个 SSR 适配器。
这个例子基于解析后表单的 POST 请求向 Comment
表插入一行:
你也可以从 API 端点查询你的数据库。这个例子通过 id
参数从 Comment
表中删除一行:
查看 Drizzle insert()
API 参考 以获取完整概述。
过滤
段落标题 过滤要通过特定属性查询表结果,请使用 Drizzle 的部分查询选项。例如,向你的 select()
查询添加 一个 .where()
调用,并传递你想做的比较操作。
以下例子查询了 Comment
表中包含 “Astro DB” 短语的所有行。使用 like()
操作符 检查 body
中是否存在短语:
Drizzle 辅助工具
段落标题 Drizzle 辅助工具所有用于构建查询的 Drizzle 辅助工具都从 astro:db
模块中暴露出来。这包括:
关系
段落标题 关系你可以使用 SQL 连接从多个表查询关联的数据。要创建一个连接查询,请使用连接操作符扩展你的 db.select()
语句。每个函数都接受一个要连接的表和一个条件来匹配两个表之间的行。
这个例子使用了 innerJoin()
函数将 Comment
的作者与他们相关的 Author
信息连接起来,基于 authorId
列。这将返回一个对象数组,每个 Author
和 Comment
行作为顶级属性:
查看 Drizzle 连接参考 以获取所有可用的连接操作符和配置选项。
批处理事务
段落标题 批处理事务所有远程数据库查询都作为网络请求进行。当进行大量查询,或者如果任何查询失败需要自动回滚时,你可能需要将查询批量处理为单个事务。
这个例子使用 db.batch()
方法在单个请求中填充多行:
查看 Drizzle db.batch()
文档以获取更多详细信息。
Astro Studio
段落标题 Astro Studio我们 即将关闭 Astro Studio。因此,2024 年 10 月 1 日之后,用户将无法再创建数据库。
我们建议 将现有 Studio 数据库迁移到 Turso,或 将 Astro DB 连接到任何 libSQL 服务器 来代替。
Astro DB 可以连接到 Astro Studio 平台,快速为你的项目添加一个托管数据库。你可以从 Astro Studio 仪表盘上查看、管理和部署新的托管数据库。
Astro Studio 网页门户 允许你通过网页界面或使用 CLI 命令 连接并管理你的远程托管的 Astro DB 数据库。
在你的 Studio 仪表板,你可以访问账号管理、帮助文章和支持消息控制台等。
访问 Astro Studio 进行注册或登录。
创建新的 Studio 项目
段落标题 创建新的 Studio 项目在 Astro Studio 中有两种方式创建项目:
-
使用 Astro Studio 网页界面从新的或现有的 GitHub 仓库创建。
点击页头中的 “create project” 按钮并按照说明开始操作。Astro Studio 将连接到你的 GitHub 仓库,并为你的项目创建一个新的托管数据库。
-
使用 Astro Studio CLI 从任何本地 Astro 项目创建。你可以运行以下命令开始:
一旦你已经成功登录并链接,你就可以运行所有的 Astro DB 命令来管理你的远程数据库。
查看 Astro DB CLI 参考 获取所有可用命令。
使用 Studio 连接进行部署
段落标题 使用 Studio 连接进行部署你可以使用与你的 Studio 数据库的实时连接来部署你的 Astro DB 项目。这可以在任何使用静态构建或 SSR 适配器 的部署平台上实现。
首先,配置你的构建命令以使用 --remote
标志与 Studio 连接。这个示例将该标志应用到你项目 package.json
中的 "build"
脚本。如果你的部署平台接受构建命令,确保这被设置成 npm run build
。
创建一个 Studio 应用令牌
段落标题 创建一个 Studio 应用令牌你需要创建一个应用令牌来从生产部署访问你的 Studio 数据库。你可以通过导航到 Settings 标签页并选择 Tokens 从你的 Studio 项目仪表板创建一个应用令牌。
复制生成的令牌并在你的部署平台中使用名称 ASTRO_STUDIO_APP_TOKEN
作为环境变量 / 环境秘钥。
设置 GitHub CI Action
段落标题 设置 GitHub CI Action你可以使用 Studio CI 流水线自动推送模式更改到你的 Studio 数据库。每当你合并到 main
时,这将会校验更改是否可以安全地进行,并且都会保持你的配置更新。
按照 GitHub 的文档 在你的仓库中配置一个新的秘钥,名称为 ASTRO_STUDIO_APP_TOKEN
,并将你的 Studio 应用令牌作为秘钥的值。
一旦你的秘钥配置好,就在你的项目的 .github/workflows
目录中创建一个新的 GitHub Actions 工作流文件,将检出仓库和安装 Node.js 作为步骤,并使用 withastro/action-studio
动作来同步模式更改。
该动作会在所有 事件触发器 上运行 astro db verify
,以确保架构更改可以安全地应用。如果你特别添加了 push 触发器,那么该动作会将这些更改推送到你的 Studio 数据库。
这个示例 GitHub Action _studio.yml
在 main
分支更新时推送更改:
推送表架构
段落标题 推送表架构随着你项目的增长,你的表架构也会随着时间的推移而改变。你可以在本地安全地测试配置更改,并在部署时推送到你的 Studio 数据库。
在从仪表板创建 Studio 项目时,你将有创建 GitHub CI 流水线的选项。这将在与你的仓库的主分支合并时自动迁移架构更改。
你也可以通过 CLI 使用 astro db push --remote
命令将本地架构更改推送到 Astro Studio:
此命令将验证你的本地更改是否可以在不丢失数据的情况下进行,并在必要时,建议如何安全地修改你的架构以解决冲突。
推送破坏性架构更改
段落标题 推送破坏性架构更改这将销毁你的数据库。仅在你不需要你的生产数据时执行此命令。
如果你必须以一种与 Astro Studio 托管的现有数据不兼容的方式更改你的表架构,你将需要重置你的生产数据库。
要推送包含破坏性更改的表架构更新,请添加 --force-reset
标志以重置所有生产数据:
重命名表
段落标题 重命名表在将你的架构推送到 Astro Studio 之后,可以重命名一个表。
如果你没有任何重要的生产数据,那么你可以使用 --force-reset
标志重置你的数据库。这个标志将会删除数据库中的所有表,并创建新的表,以便它完全匹配你当前的架构。
为了在保留你的生产数据的同时重命名一个表,你必须执行一系列非破坏性更改,以安全地将你的本地架构推送到 Astro Studio。
以下示例将一个表从 Comment
重命名为 Feedback
:
-
在你的数据库配置文件中,为你想要重命名的表添加
deprecated: true
属性: -
添加一个新的表架构(完全匹配现有表的属性)并使用新名称:
-
使用
astro db push --remote
推送到 Astro Studio。这将添加新表并将旧表标记为已弃用。 -
更新你的本地项目代码以使用新表而不是旧表。你可能还需要将数据迁移到新表。
-
当你确信旧表不再被你的项目使用时,可以从你的
config.ts
中移除该架构: -
再次使用
astro db push --remote
命令推送到 Astro Studio。旧表将被删除,只留下新的、重命名的表。
推送数据
段落标题 推送数据你可能需要将数据推送到你的 Studio 数据库进行填充或数据迁移。你可以使用 astro:db
模块创建一个 .ts
文件来编写类型安全的查询。然后,使用命令 astro db execute <file-path> --remote
执行该文件对你的 Studio 数据库:
以下评论可以使用命令 astro db execute db/seed.ts --remote
进行填充:
查看 CLI 参考 获取完整的命令列表。
连接 Astro Studio
段落标题 连接 Astro Studio默认情况下,当你运行 dev
或 build
命令时,Astro 将使用本地数据库文件。每次运行命令时,表都会从头开始重新创建,并插入开发的样例数据。
要连接到你的托管 Studio 数据库,你可以添加 --remote
参数。使用此参数进行生产部署,以便对你的 Studio 数据库拥有可读写权限。这将允许你 接受并持久化用户数据。
在开发中使用 --remote
时要小心。这将连接到实时生产数据库,所有的插入、更新或删除都将被持久化。
要使用远程连接,你需要一个应用令牌来进行 Studio 认证。请访问 Studio 控制面板获取令牌创建和设置指南。
当你准备好部署时,参见我们的 使用 Studio 连接进行部署指南。
从 Astro Studio 迁移到 Turso
段落标题 从 Astro Studio 迁移到 Turso- 在 Studio 仪表板 中,导航到你要迁移的项目。在设置选项卡中,使用 “Export Database(导出数据库)” 按钮下载数据库的转储。
- 按照官方说明 安装 Turso CLI 并 注册或登录 你的 Turso 帐户。
- 使用你在步骤 1 中下载的
.sql
转储创建一个新数据库。 - 使用 Turso CLI 获取数据库 URL,并将其配置为环境变量
ASTRO_DB_REMOTE_URL
。 - 创建一个令牌来访问你的数据库,并将其配置为环境变量
ASTRO_DB_APP_TOKEN
。 - 一旦确认你的项目连接到新数据库,你就可以安全地从 Astro Studio 中删除该项目了。
libSQL
段落标题 libSQL
添加于:
@astrojs/db@0.14.0
新
Astro DB 可以从任何公开 libSQL 服务器远程协议的平台,连接到任何 libSQL 服务器,或者也可以自托管。
要将 Astro DB 连接到 libSQL 数据库,需要设置以下环境变量:
ASTRO_DB_REMOTE_URL
: libSQL 服务器的连接 URLASTRO_DB_APP_TOKEN
: libSQL 服务器的身份验证令牌
使用 libSQL 时和连接到 Astro Studio 托管数据库时,部署和推送更改到数据库的命令是相同的。不过,当使用 --remote
选项运行命令,如 astro build
和 astro db push
时,都需要在本地设置环境变量。
libSQL 连接的详细信息(例如加密密钥、备份、同步间隔)可以配置为远程连接 URL 中的查询参数。
例如,要让本地文件作为加密 libSQL 服务器的嵌入式副本,你可以设置以下环境变量:
URL 方案和 host
段落标题 URL 方案和 hostlibSQL 同时支持 HTTP 和 WebSockets 作为远程服务器的传输协议。它还支持使用本地文件或内存数据库。这些都可以在连接 URL 中使用以下 URL 方案来进行配置:
memory:
将使用内存数据库。在这种情况下,host 必须为空。file:
将使用本地文件。host 是文件的路径(file:path/to/file.db
)。libsql:
将通过库首选的协议使用远程服务器(可能因版本而异)。host 是服务器的地址(libsql://your.server.io
)。http:
将通过 HTTP 使用远程服务器。https:
可用于启用安全连接。host 和libsql
相同。ws:
将通过 WebSockets 使用远程服务器。wss:
可用于启用安全连接。 host 和libsql
相同。
encryptionKey
段落标题 encryptionKeylibSQL 对加密数据库具有原生支持。传递此搜索参数将使用给定密钥的加密:
syncUrl
段落标题 syncUrl嵌入式副本是 libSQL 客户端的一项功能,可在本地文件或内存中实现数据库的完整同步副本,以实现超快读取。写入将发送到在 syncUrl
上定义的远程数据库并与本地副本同步。
使用此属性来传递单独的连接 URL,并将 DB 转换为另一个数据库的嵌入式副本。此属性只应与 file:
和 memory:
方案来一起使用。该参数必须经过 URL 编码。
例如,要在 libsql://your.server.io
上拥有数据库的内存嵌入式副本,你可以按如下方式设置连接 URL:
syncInterval
段落标题 syncInterval嵌入式副本同步之间的时间间隔(以秒为单位)。默认情况下,它仅在启动时和写入后同步。
此属性仅在同时设置了 syncUrl
时才生效。例如,要将内存中嵌入式副本设置为每分钟同步,请设置以下环境变量:
构建 Astro DB 集成
段落标题 构建 Astro DB 集成Astro 集成 可以通过额外的 Astro DB 表和填充数据来扩展用户项目。
在 astro:db:setup
钩子中使用 extendDb()
方法注册额外的 Astro DB 配置和填充文件。
defineDbIntegration()
辅助函数为 astro:db:setup
钩子提供 TypeScript 支持和自动补全。
集成的 配置 和 填充 文件遵循与其用户定义的等效项相同的格式。
在集成中进行类型安全操作
段落标题 在集成中进行类型安全操作在进行集成工作时,你可能无法从 astro:db
导出的 Astro 生成的表类型中获益。
为了完全的类型安全,使用 asDrizzleTable()
辅助工具创建一个可以用于数据库操作的表引用对象。
例如,给定一个集成设置以下 Pets
数据库表:
填充文件可以导入 Pets
并使用 asDrizzleTable()
向你的表插入具有类型检查的行:
asDrizzleTable('Pets', Pets)
返回的值等同于 import { Pets } from 'astro:db'
,但即使 Astro 的类型生成无法运行时也可用。
你可以在任何需要查询或插入数据库的集成代码中使用它。
自托管生产部署
段落标题 自托管生产部署如果你将网站部署到自管理的主机上,例如 虚拟私人服务器,你可以选择使用数据库文件,而不是连接到 Astro Studio 托管的数据库。
使用数据库文件是一项高级功能,在部署时需要小心,以防覆盖你的数据库并丢失你的生产数据。
此外,这种方法不适用于无服务器(serverless)部署,因为在这些环境中文件系统不会持久化。
对于全托管的解决方案,建议连接到 Astro Studio 平台上托管的数据库。
如果你能够接受这些风险,并且能够自己管理部署,你可以使用数据库文件,而不是连接到 Studio。
在构建过程中,设置 ASTRO_DATABASE_FILE
环境变量,将其指向宿主环境中你的 .db
文件的路径:
构建过程会将此路径静态编译为你的生产数据库。当你部署并启动你的服务器时,它将连接到生产主机上此路径的文件。
此外,推送任何表架构更改(也称为“架构迁移”)必须使用此环境变量手动管理。
如果你在部署时覆盖了你的 .db
文件,你将会丢失你的生产数据。请仔细遵循你的主机的部署方法流程,以防止数据丢失。