外观
数据库设计
数据库各个表的Schema定义在 src/models/*.mts
中。我们使用 knex 这个 sql builder 来定义库表结构。以 news
表为例:
typescript
import { createTableIfNotExist } from "#scripts/DatabaseUtils";
// 创建新闻表
export async function createTableNewsIfNotExist(): Promise<void> {
await createTableIfNotExist({
tableName: "news",
createTable: (table) => {
table.string("title", 255).notNullable().comment("新闻标题");
table.text("content_md").notNullable().comment("Markdown格式的新闻内容");
table.text("content_html").comment("转换后的HTML格式内容");
table.text("summary").comment("摘要文本");
table
.enum("status", ["draft", "published", "deleted"])
.defaultTo("draft")
.comment("状态(草稿、已发布、已下线)");
table.integer("views").defaultTo(0).comment("浏览量");
table.string("thumbnail", 255).comment("封面图片链接");
},
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上面的代码定义了一个 news
表,显示地定义了以下字段:
title
: 新闻标题,字符串类型,最大长度255,不允许为空。content_md
: 新闻内容,Markdown格式,文本类型,不允许为空。content_html
: 转换后的HTML格式内容,文本类型。summary
: 摘要文本,文本类型。status
: 新闻状态,枚举类型,包含 "draft"(草稿)、"published"(已发布)、"deleted"(已下线),默认值为 "draft"。views
: 浏览量,整数类型,默认值为0。thumbnail
: 封面图片链接,字符串类型,最大长度255。
提示
createTableIfNotExist
方法默认会自动帮你定义 id
、created_at
, updated_at
字段,不要再显示定义。
如果你不需要这个默认行为,可以通过传入 disableId
、disableCreatedAt
或 disableUpdatedAt
字段来覆盖默认行为。
typescript
async function createTableIfNotExist(
params: ParamsCreateTableIfNotExist,
): Promise<void>;
interface ParamsCreateTableIfNotExist {
tableName: string;
createTable: (table: import("knex").Knex.TableBuilder) => void;
disableId?: boolean; // 是否禁用默认的 id 主键列,默认为 false
disableCreatedAt?: boolean; // 是否禁用默认的 created_at 列,默认为 false
disableUpdatedAt?: boolean; // 是否禁用默认的 updated_at 列,默认为 false
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11