Cloudflare D1
Cloudflare D1 是 Cloudflare 推出的 Serverless SQLite 数据库,原生集成在 Cloudflare Workers 生态中,零配置、零运维,按需计费,适合边缘计算和全球分布式应用场景。
ShipAny 已集成 Cloudflare D1,按照下面的步骤快速接入。
快速开始
在项目根目录下执行命令,创建 D1 数据库:
pnpm wrangler d1 create your-database-name创建完成后,记录下数据库的 database_name 和 database_id,后续配置会用到。
在项目根目录的 wrangler.toml 文件中,添加 D1 数据库绑定配置:
[[d1_databases]]
binding = "DB"
database_name = "your-database-name"
database_id = "your-database-id"
migrations_dir = "src/config/db/migrations_d1"- binding,D1 数据库在 Workers 中的绑定名称,固定值
DB - database_name,D1 数据库名称,填创建时设置的名称
- database_id,D1 数据库 ID,填创建后获取的 ID
- migrations_dir,选填,数据库迁移文件目录,默认值
./migrations/,需要与 env 文件中的 DB_MIGRATIONS_OUT 配置一致
在项目的环境变量文件中,填入 D1 数据库相关的配置。
- 本地开发环境变量文件
.env.development - 生产环境变量文件
.env.production - Cloudflare Workers 环境变量文件
wrangler.toml
DATABASE_PROVIDER = "d1"
DB_SCHEMA_FILE = "./src/config/db/schema.sqlite.ts"
DB_MIGRATIONS_OUT = "./src/config/db/migrations_d1"- DATABASE_PROVIDER,必填,固定值
d1 - DB_SCHEMA_FILE,必填,固定值
./src/config/db/schema.sqlite.ts - DB_MIGRATIONS_OUT,选填,数据库迁移文件输出路径,默认值
./src/config/db/migrations,可以根据数据库类型选择不同的输出路径
注意:D1 数据库通过 Workers 绑定访问,不需要配置 DATABASE_URL。
使用 D1 数据库时,数据表结构定义在 ./src/config/db/schema.sqlite.ts 文件中(D1 兼容 SQLite 语法),你需要导出这个文件的数据表。
打开 ./src/config/db/schema.ts 文件,修改内容为:
export * from './schema.sqlite';先生成迁移文件:
pnpm db:generate然后在项目根目录下执行命令,迁移数据表到远端的 D1 数据库:
pnpm wrangler d1 migrations apply your-database-name --remote你可以在 Cloudflare Dashboard 的 D1 管理页面查看和管理数据库,也可以通过命令行操作:
pnpm wrangler d1 execute your-database-name --remote --command "SELECT * FROM user LIMIT 10"自定义
修改数据表
如果你需要新增数据表,或者修改数据表字段,可以打开 ./src/config/db/schema.sqlite.ts 文件,修改数据表结构。
修改完成后,执行以下命令,生成并应用迁移:
pnpm db:generate
pnpm wrangler d1 migrations apply your-database-name --remote修改数据库连接
D1 数据库通过 Cloudflare Workers 的绑定机制访问,连接由 Workers 运行时自动管理,无需手动配置连接池或认证信息。
在进行数据操作时,默认使用的是 ./src/core/db/index.ts 导出的 db() 对象,导出类型是 any,在某些情况下,可能会缺乏类型提示。
import { db } from '@/core/db';
import { user } from '@/config/db/schema';
const [result] = await db().select().from(user).limit(1);如果你希望使用强类型的数据库对象,可以在操作数据时,使用以下方式获取数据库对象:
import { dbSqlite } from '@/core/db';
import { user } from '@/config/db/schema';
const [result] = await dbSqlite().select().from(user).limit(1);部署到 Cloudflare Workers
D1 是 Cloudflare 的原生服务,天然支持部署到 Cloudflare Workers,无需额外配置 Hyperdrive 或外部连接。
在 Cloudflare Workers 部署的 wrangler.toml 部分内容参考:
[[d1_databases]]
binding = "DB"
database_name = "your-database-name"
database_id = "your-database-id"
migrations_dir = "src/config/db/migrations_d1"
[vars]
DATABASE_PROVIDER = "d1"以上演示的是在 ShipAny 项目连接远端的 Cloudflare D1 数据库,本地开发建议使用:SQLite 数据库。