Diesel CLI 是 Diesel 提供的一个可选工具,用于管理数据库 schema 。它的两个主要功能是运行数据库迁移和创建一个代表数据库 schema 的 Rust 文件。

Diesel CLI 的行为可以通过一个 toml 文件进行配置。默认情况下,Diesel 会在与 Cargo.toml 文件相同的目录下查找 diesel.toml 文件。您可以通过设置 DIESEL_CONFIG_FILE 环境变量或在命令行上传递 --config-file 来提供不同的配置文件。您可以通过运行 diesel setup 命令获得一个包含一些默认设置的基本配置文件。

在 Diesel 2.0 版本中,该文件包含一个名为 [print_schema] 的部分。此文件中的所有字段都是可选的。

file 字段

这个字段指定了您希望 Rust 代码中数据库 schema 表示形式的文件位置。当这个字段存在时,任何修改数据库 schema 的命令(比如 diesel migration run)都会自动执行 diesel print-schema 命令,并将输出结果写入这个文件。

这意味着您可以自由地修改数必担心据库 schema ,而不要单独运行一个命令来更新 Rust 代码。强烈建议您使用这个字段,以确保 Rust 代码中数据库 schema 的表示始终与数据库中的实际内容保持一致。通常,这个字段被设置为 src/schema.rs

与其他字段不同,这个字段并不会改变 diesel print-schema 的行为。无论这个字段是否存在,diesel print-schema 都会将 schema 输出到标准输出,而不会写入文件。

with_docs 字段

当这个字段设置为 true 时,diesel print-schema 命令会默认启用 --with-docs 参数的行为。这意味着它会为所有表和列自动添加文档注释。

filter 字段

这个字段指定了 diesel print-schema 命令应该输出的表。它与命令行上的 --only-tables--except-tables 参数相对应。它的值应该是一个映射,其中包含这两个参数中的一个。例如:

[print_schema]
# 这将导致只输出 users 和 posts 这两个表。
filter = { only_tables = ["users", "posts"] }

# 这将导致 `diesel print-schema` 输出所有表,除了 comments 表。
filter = { except_tables = ["comments"] }

schema 字段

这个字段指定了在搜索表时应使用的数据库 schema。当这个字段被设置时,diesel print-schema 命令总是表现得好像已经指定了 --schema 参数。这个字段只适用于 PostgreSQL 数据库。如果没有提供值,默认会搜索 public schema。

generate_missing_sql_type_definitions 字段

这个字段接受一个布尔值,用于设置 diesel print-schema 是否在 schema.rs 文件中生成缺失的 SQL 类型定义。生成的 SQL 类型定义会被放置在生成的 schema.rs 文件中的一个独立的 sql_types 模块里。这将只为 diesel print-schema 生成的 table! 定义中实际使用的 SQL 类型生成定义。这些定义会自动使用自动生成的 SQL 类型定义。

如果这个字段不存在或被设置为 truediesel print-schema 将生成相应的定义。这个配置只为基于 PostgreSQL 的数据库系统生成自定义 SQL 类型定义,因为 SQLite 和 MySQL 使用一组固定的 SQL 类型。

[print_schema]
# 不生成缺失的 SQL 类型定义
generate_missing_sql_type_definitions = false

custom_type_derives 字段

这个字段会自动向由 generate_missing_sql_type_definitions 字段生成的 SQL 类型定义中添加 #[derive(...)] 项。 当这个字段被设置时,diesel print-schema 命令会表现得好像已经指定了 --custom-type-derives 参数。 如果这个标志为空或不包含特定的 trait,diesel::sql_types::SqlType trait 将自动被添加。

[print_schema]
generate_missing_sql_type_definitions = true
# 为自动生成的类型添加 SqlType 和 Debug 
custom_type_derives = ["diesel::sql_types::SqlType", "std::fmt::Debug"]

import_types 字段

这个字段会在每个 table! 声明的顶部添加 use 语句。当这个字段被设置时,diesel print-schema 命令会表现得好像已经指定了 --import-types 参数。 如果没有提供值,则只会从 diesel::sql_types 模块导入类型。

[print_schema]
# 添加来自 `diesel_full_text_search` 的类型, 比如 `tsvector`
import_types = ["diesel::sql_types::*", "diesel_full_text_search::types::*"]

patch_file 字段

此字段指定一个 .patch 文件,该文件将在 schema 生成后应用于您的数据库。它与命令行上的 --patch-file 选项相对应。

由于可能的定制选项非常多,我们无法为这个文件提供每一个可能的定制选项。它充当了一个通用目的的钩子,用于进行数据库 schema 的定制。

该文件应该是一个统一差异(unified diff)格式,您可以使用 diff 命令或 git diff 命令来生成。如果您已经设置了 import_types,强烈建议您提供超过3行的上下文信息。

您可以通过在 schema.rs 文件中应用您想要的变化,然后运行 git diff -U6 > src/schema.patch 命令来轻松生成这个补丁文件。