Drizzle 模式
Drizzle 允许您使用 TypeScript 定义模式,支持底层数据库的各种模型和属性。
当您定义模式时,它将作为未来查询(使用 Drizzle-ORM)和迁移(使用 Drizzle-Kit)
修改的真实性源。
如果您使用 Drizzle-Kit 进行迁移过程,请确保从您模式文件中导出所有定义的模型,以便 Drizzle-Kit 可以导入它们并在迁移差异过程中使用。
组织您的模式文件
您可以将 SQL 模式直接在 TypeScript 中声明,或者将所有内容放在一个 schema.ts
文件中,
或者您可以分散它们——随您所愿,完全没有限制!
单文件中的模式
使用 Drizzle 声明模式的最常见方法是将所有表放在一个 schema.ts
文件中。
注意:您可以将模式文件命名为您喜欢的任何名称。例如,可以是 models.ts
或其他名称。
如果您没有定义太多表模型,或者您认为将它们放在一个文件中没有问题,这种方法效果很好。
示例:
在 drizzle.config.ts
文件中,您需要指定模式文件的路径。
通过此配置,Drizzle 将从 schema.ts
文件读取并在迁移生成过程中使用此信息。
有关 drizzle.config.ts
文件和使用 Drizzle 进行迁移的更多信息,请查看:链接
多文件中的模式
您可以将 Drizzle 模型(例如表、枚举、序列等)放置在一个文件中,也可以放在任何您想要的文件中。
您需要确保从这些文件中导出所有模型,
以便 Drizzle kit 可以导入并在迁移中使用它们。
一个常见的用例是将每个表分开到自己的文件中。
在 drizzle.config.ts
文件中,您需要指定模式文件夹的路径。
通过此配置,Drizzle 将从 schema
文件夹读取并递归查找所有文件,并从中获取所有 drizzle 表。
有关 drizzle.config.ts
文件和使用 Drizzle 进行迁移的更多信息,请查看:链接
您还可以以任何您喜欢的方式对它们进行分组,例如为用户相关表、消息相关表、产品相关表等创建组。
在 drizzle.config.ts
文件中,您需要指定模式文件路径。
通过此配置,Drizzle 将从 schema.ts
文件读取并在迁移生成过程中使用此信息。
有关 drizzle.config.ts
文件和使用 Drizzle 进行迁移的更多信息,请查看:链接
塑造您的数据模式
Drizzle 模式由您正在使用的数据库中的几种模型类型构成。使用 Drizzle,您可以指定:
- 含有列、约束等的表。
- 模式(仅适用于 PostgreSQL)
- 枚举
- 序列(仅适用于 PostgreSQL)
- 视图
- 材料化视图
- 等等。
让我们逐个检查模式如何使用 Drizzle 定义。
表和列声明
在 Drizzle 中,表应至少定义 1 列,正如在数据库中应做的那样。有一件重要的事需要知道,
Drizzle 中没有通用的表对象。您需要选择使用的方言:PostgreSQL、MySQL 或 SQLite。
PostgreSQL 表
MySQL 表
SQLite 表
默认情况下,Drizzle 将在数据库查询中使用 TypeScript 键名作为列名。
因此,来自示例的模式和查询将生成如下 SQL 查询。
此示例使用一个 db 对象,但其初始化未在本部分文档中覆盖。要了解如何连接到数据库,请参阅 连接文档
TypeScript 键 = 数据库键
如果您想在 TypeScript 代码中和数据库中使用不同的名称,您可以使用列别名。
驼峰和蛇形命名
数据库模型名称通常使用 snake_case
约定,而在 TypeScript 中,常用 camelCase
进行命名。
这可能会导致模式中有很多别名定义。为了解决这个问题,
Drizzle 提供了一种方法来自动将 TypeScript 中的 camelCase
映射到数据库中的 snake_case
,通过在 Drizzle 数据库初始化时包含一个可选参数。
对于这种映射,您可以在 Drizzle DB 声明中使用 casing
选项。
此参数将帮助您指定数据库模型命名约定,并将尝试相应地映射所有 JavaScript 键。
高级
使用 Drizzle ORM 您可以使用一些技巧。只要 Drizzle 完全在 TypeScript 文件中,
您就可以像在简单的 TypeScript 项目中一样进行任何编码。
一个常见的特性是将列分离到不同的位置,然后重复使用它们。
例如,考虑字段 updated_at
、created_at
和 deleted_at
。
许多表/模型可能需要这三个字段来跟踪和分析系统中实体的创建、删除和更新。
我们可以在一个单独的文件中定义这些列,然后在所有表对象中导入并展开它们。
模式
在 PostgreSQL 中,有一个实体称为 schema
(我们认为应该称为 folders
)。这在 PostgreSQL 中创建了一个结构:
您可以使用 pgSchema
管理 PostgreSQL 模式,并将任何其他模型放入其中。
使用 Drizzle 定义您想要管理的模式
然后将表放入模式对象中
在 MySQL 中,有一个实体称为 Schema
,但在 MySQL 术语中,相当于 Database
。
您可以使用 drizzle-orm
定义它们并在查询中使用,但它们不会被 drizzle-kit
检测到或包含在迁移流中。
使用 Drizzle 定义您想要管理的模式
然后将表放入模式对象中
在 SQLite 中,没有模式的概念,因此您只能在单个 SQLite 文件上下文中定义表。
示例
一旦您掌握了基础知识,让我们为一个实际项目定义一个模式示例,以获得更好的视图和理解。
所有示例将使用 generateUniqueString
。其实现将在所有模式示例之后提供。
generateUniqueString
实现:
接下来做什么?