跳转至内容
There is a version suitable for your browser's language settings. Would you like to go to the english language of the site?
主页文档

起步

H1

几乎所有的应用都需要数据库。数据库可以让我们轻松高效地保存和读取数据。而想要与数据库打交道,则需要使用一种被称作 ORM(Object-Relational Mapping,对象关系映射)的框架,作为应用与数据库之间的桥梁。

在 Milkio 中,Drizzle 是首选的 ORM。它是唯一同时具有关系型查询 API 和类似 SQL 查询 API 的 ORM,在访问关系数据时为您提供两全其美的服务。

为什么需要使用 Drizzle?

数据库使用 SQL 作为语言,尽管单独使用它很简单,但是,当我们在代码中编写 SQL 时,就会为我们带来困扰。因为 SQL 是字符串,没有语法高亮、自动补全和错误提示,这让我们在编写过程中感到痛苦。同时,我们也很容易写出存在 SQL 注入漏洞 的代码。Drizzle 和其他 ORM 库都正在为我们解决这些问题,让我们和数据库打起交道来更加容易。

入门

在使用 Drizzle 之前,你需要先安装 Drizzle 及其所需的依赖,根据数据库不同,所需的依赖也不同。你可以阅读 Drizzle 文档 来了解如何使用你的数据库。下面,是关于使用 MySQL 和 PostgreSQL 的示例。请注意,如果你使用一些 serverless 提供商的数据库服务,即使这些数据库是兼容 MySQL 或 PostgreSQL 的,也请尽量阅读 Drizzle 的文档,这样你可以了解如何最佳地组合它们。

终端窗口
bun add drizzle-orm mysql2 # MySQL
终端窗口
bun add drizzle-orm @vercel/postgres # PostgreSQL

Milkio 和 Drizzle

你还需要安装 Milkio 与 Drizzle 结合所需的包,来简化你的 Drizzle 开发体验。

终端窗口
bun add milkio-drizzle

Drizzle 需要我们将所有的数据库表集合在一起。得益于 Milkio 的 生成阶段,我们可以在分开建立数据库表的同时,又不用手动编写一个文件将所有的数据库表结合在一起。

我们需要在 /milkio.tomlgenerate 配置中,在 significant 中添加下面的命令。这样在我们每次修改完文件后,Milkio 就会自动读取 /src/databases 目录,并且,将所有的 .ts 文件都在 /generated/database-schema.ts 中合并。

/milkio.toml
[generate]
significant = ['./node_modules/milkio-drizzle/g.ts']

除此以外,我们还需要确保 database-schema.ts 始终存在。在你的 milkio.toml 末尾粘贴:

/milkio.toml
[exists.milkio-drizzle]
path = '/generated/database-schema.ts'
content = ''

数据库配置

/.env 文件中,将数据库的连接信息填写在里面。如果你不知道这些信息该填写为什么,请询问你所使用的数据库提供商。

/.env
DB_HOST=your-database-host
DB_PORT=your-database-port
DB_USERNAME=your-database-username
DB_PASSWORD=your-database-password
DB_DATABASE=your-database-name

接下来,我们编写数据库的连接信息。我们在 /src/config 目录下,创建一个 drizzle.ts 文件。

import { env } from "node:process";
import { envToBoolean, envToNumber, envToString } from "milkio";
export const configDrizzle = {
dbHost: envToString(env.DB_HOST, "your-default-database-host"),
dbPort: envToNumber(env.DB_PORT, 3306),
dbUsername: envToString(env.DB_USERNAME, "your-default-username"),
dbPassword: envToString(env.DB_PASSWORD, "your-default-password"),
dbDatabase: envToString(env.DB_DATABASE, "your-default-database"),
};

在你的 /src/uses 目录中,创建一个 drizzle.ts,并将下面的代码粘贴进去。下面的示例代码是 MySQL 的,你可能需要阅读 Drizzle Get Started,根据你实际所使用的数据库或者在使用的 serverless 提供商来修改下面的代码。总而言之,就是将 Drizzle 放到 Milkio 的 Use 里。

/src/uses/drizzle.ts
// 适用于 MySQL
// @ts-ignore
import * as schema from "../../generated/database-schema";
import { configDrizzle } from "../config/drizzle";
import { drizzle } from "drizzle-orm/mysql2";
import mysql from "mysql2/promise";
import { defineUse } from "milkio";
export const useDrizzle = defineUse(async () => {
const connection = await mysql.createConnection({
host: configDrizzle.dbHost,
port: configDrizzle.dbPort,
user: configDrizzle.dbUsername,
password: configDrizzle.dbPassword,
database: configDrizzle.dbDatabase,
});
return drizzle(connection, { schema, mode: "default" });
});

上面的示例是适用于 MySQL 的代码。如果你使用 PostgreSQL,可以使用下面的代码。

/src/uses/drizzle.ts
// 适用于 PostgreSQL
// 待补充...

为什么 NoSQL 不是 Milkio 的首选?

MySQL、PostgreSQL 等关系型数据库最大的特点是拥有类型,就像我们使用 TypeScript 而不是 JavaScript 一样,类型可以帮助我们犯更少的错误,并且让其他代码阅读者更容易理解我们代码的意图。

使用关系型数据库最大的挑战在于编写 SQL 和通过 LEFT JOIN 的思考方式,去查询有关联关系的表中的数据。而 Drizzle 和其他 ORM 库,都是为了解决这些问题而诞生的,现在,这些已经不再是一个问题了。

此外,现在 Serverless 几乎都只提供关系型数据库,如 Vercel 的 Vercel Postgres、Cloudflare 的 D1、Tencent Cloud 的 TDSQL-C。

在尝试了 Drizzle 之后,你很可能会改变你对关系型数据库的看法。我们还专门编写了一个章节,来帮助零 SQL 基础的人来快速入门 Drizzle,稍后你可以阅读 用法 章节。