CloudFlare D1 数据库使用文档

相关文档:

简要步骤(cli 方式)如下:

  1. 初始化项目-创建 worker
  2. 进入项目-创建 database
  3. 绑定 worker 到 database
  4. 创建表、查询表、通过 worker 访问数据库
  5. 开发|部署|删除 数据库

这些步骤都在官方文档中写的清清楚楚,而针对 worker 和 database 的关系是多对多。

worker 访问多个 database 的话,需要将多个 database 的 id 和 name 填入到 wrangler.toml 文件中。 而一个 database 可以被多个 worker 访问。只要在别的 worker 中也绑定相同的 database 即可。

1. 创建 worker

          pnpm create cloudflare@latest d1-tutorial

        
BASH

先按照 CloudFlare D1 初始化 文档创建一个数据库。

初始化项目

2. 创建 database

          cd d1-tutorial
npx wrangler d1 create prod-d1-tutorial

        
BASH

这里的 prod-d1-tutorial 是数据库的名称,可以自定义。在执行完 create 命令后,会显示出数据库的 name 和 id。

3. 绑定 worker 到 database

将上面获取到的 name 和 id 填入到 wrangler.toml 文件中。

          [[d1_databases]]
binding = "DB"
database_name = "prod-d1-tutorial"
database_id = "xxxxx"

        
TEXT

记得别忘记 [[d1_databases]] 这一行。 而这里的 binding 就是在 worker 中访问数据库的名称。

然后执行一下:npm run cf-typegen ,这会将 wrangler.toml 中的数据库信息生成到 worker-configuration.d.ts 文件中。

那这样,上面的 DB 可以理解为外键,在 worker 中也就可以通过 DB 来访问数据库。

4. 创建表、查询表、通过 worker 访问数据库

上一步绑定成功后,这一步直接按照官方文档走,不会有任何问题。

修改好 /src/index.ts 文件后,可以通过 worker 访问了,执行启动项目:npm run dev ,就可以在浏览器中访问到 worker 执行查询了。

  1. 创建表:
schema.sql
SQL
          DROP TABLE IF EXISTS Customers;

CREATE TABLE
    IF NOT EXISTS Customers (
        CustomerId INTEGER PRIMARY KEY,
        CompanyName TEXT,
        ContactName TEXT
    );

INSERT INTO
    Customers (CustomerID, CompanyName, ContactName)
VALUES
    (1, 'Alfreds Futterkiste', 'Maria Anders'),
    (4, 'Around the Horn', 'Thomas Hardy'),
    (11, 'Bs Beverages', 'Victoria Ashworth'),
    (13, 'Bs Beverages', 'Random Name');

        
  1. 写入到本地开发数据库中:
          npx wrangler d1 execute prod-d1-tutorial --local --file schema.sql

        
BASH
  1. 执行查询:
          npx wrangler d1 execute prod-d1-tutorial --remote --command="SELECT * FROM Customers"

        
BASH
  1. 写入 src/index.ts 文件,运行项目并访问:
src/index.ts
TS
          export default {
    async fetch(request, env: Env): Promise<Response> {
        const { pathname } = new URL(request.url);

        if (pathname === "/api/beverages") {
            const { results } = await env.DB.prepare(
                "SELECT * FROM Customers WHERE CompanyName = ?",
            )
                .bind("Bs Beverages")
                .all();
            return Response.json(results);
        }

        return new Response(
            "Call /api/beverages to see everyone who works at Bs Beverages",
        );
    },
} satisfies ExportedHandler<Env>;

        

执行命令:

          npm run dev

        
BASH

本地开发绑定的地址和端口号: http://localhost:8787/

通过这个地址访问 /api/beverages ,就可以看到查询结果了。

5. 开发|部署|删除 数据库

这里也是,直接照官网文档执行命令就好了。

可以通过这个命令查询到当前 worker 绑定的数据库:

          npx wrangler d1 list

        
BASH

查询数据库列表

6. 直接通过 sql 查询数据

上面几条就是官网的步骤,非常简单的就实现了通过 worker 查询数据库,并且发布到了 CloudFlare 上。

但是在开发过程中,可能会需要直接通过 sql 查询数据,而不是先写个 worker 再执行 worker 查询。直接 sql 查询会更方便。

所以还是需要有一个 sql 的文件,然后通过 npx wrangler d1 execute 命令执行。

7. 使用 hono.js 框架分发路由

因为直接单调的使用 fetch 请求,路由会显得很麻烦。 所以这里考虑使用 hono.js 框架,进行路由分发。CloudFlare 也支持 hono.js 框架,文档如下: https://developers.cloudflare.com/d1/examples/d1-and-hono/。

7.1 安装 hono.js 框架

          pnpm run install hono

        
BASH

7.2 修改 index.ts 文件

src/index.ts
TS
          import { Context, Hono } from "hono";
import { Bindings } from "hono/types";

const app = new Hono<{ Bindings: Bindings }>();

app.get('/', (c) => c.text('Hello World'))

app.get("/api/beverages", async (c: Context) => {
    try {
        let { results } = await c.env.DB.prepare(
            "SELECT * FROM Customers WHERE CompanyName = ?",
        )
            .bind("Bs Beverages")
            .all();
        return c.json(results);
    } catch (e: any) {
        return c.json({ err: e.message }, 500);
    }
})
export default app

        

7.3 运行项目并访问

          npm run dev

        
BASH

访问地址: http://localhost:8787/

页面中会显示hello world

访问 http://localhost:8787/api/beverages ,会看到执行 sql 的查询结果。

7.4 部署项目

          npx wrangler deploy

        
BASH

部署成功后,会返回一个 url 地址,访问这个地址,就跟访问本地开发环境一样的结果。

8. 总结

通过上面的步骤,就能创建并使用 CloudFlare D1 数据库了。

但是 CloudFlare 的 D1 数据库并没有修改命令,比如上面我们按照教程创建的名为 prod-d1-tutorial 的数据库,如果想要修改名称,则需要删除再发布。

删除

          npx wrangler d1 delete prod-d1-tutorial

        
BASH

发布

          npx wrangler deploy

        
BASH

还是能重新发布上去,然后直接用的。