驱动程序接口变更日志

Metabase 0.57.0

  • driver/field-reference-mlv2 已被弃用,不再使用。请删除您的实现。

  • metabase.driver-api.core/qp.add.nfc-path 现在得到更一致的填充;对于 MongoDB 等驱动程序,其他 qp.add.* 键不再包含父列名——请改用 qp.add.nfc-path 来根据需要使用父列名限定 qp.add.source-column-alias

  • 添加了 metabase.driver/compile-transform、metabase.driver/compile-drop-table、metabase.driver/execute-raw-queries!、metabase.driver/run-transform!、metabase.driver/drop-transform-target!、metabase.driver/native-query-deps、metabase.driver/connection-spec、metabase.driver/table-exists?、metabase.driver.sql/normalize-name 和 metabase.driver.sql/default-schema 以实现 SQL 转换。

  • 添加了 metabase.driver/rename-tables!* 多方法,用于原子表重命名操作。接受一个 {from-table to-table} 对的映射,该映射已按拓扑排序。

  • 添加了 metabase.driver/rename-table! 多方法,用于表重命名操作。接受一个 from-table 到 to-table 的对。如果可用,则回退到对 rename-tables!* 的单例调用。

  • 添加了驱动程序多方法 metabase.driver/schema-exists?metabase.driver/create-schema-if-needed!,这些应由支持 :schemas:transforms/table 的驱动程序实现。

  • 添加了驱动程序多方法 metabase.driver/type->database-type,它返回给定 Metabase 类型(来自类型层次结构)的数据库类型,作为 HoneySQL 规范。此方法处理通用的 Metabase 基本类型。

  • 添加了驱动程序多方法 driver/native-result-metadata、driver/validate-native-query-fields、driver.sql/resolve-field、driver.sql.normalize-unquoted-name、driver.sql.normalize/reserved-literal、driver.sql.references/find-used-fields、driver.sql.references/find-returned-fields 和 driver.sql.references/field-references-impl,用于 :dependencies/native 功能。

  • 添加了 metabase.driver/insert-from-source! 多方法,它将数据从各种源插入到现有表中。此多方法根据驱动程序和数据源类型(:rows:jsonl-file)分派。它允许驱动程序根据数据源类型进行优化,并返回插入的行数。为 :rows:jsonl-file 源类型提供了默认实现。

  • 添加了 metabase.driver/insert-col->val 多方法,用于根据驱动程序、数据源类型和列定义解析插入值。驱动程序应在它们的插入机制需要将值转换为适当类型时实现此方法。

  • metabase.driver/humanize-connection-error-message 现在接受异常链中的所有消息列表,而不是只接受顶层消息作为字符串。

  • 已删除 driver/set-database-used。驱动程序应在它们的连接规范中设置默认数据库。

  • metabase.driver.common.table-rows-sample/table-rows-sample 的可选 :order-by 选项现在应该是你可以传递给 [[metabase.lib.core/order-by]] 的内容——例如,一个 Lib :metadata/column 或一个 [MBQL 5] metabase.driver-api.core/order-by-clause

  • metabase.driver-api.core/nest-query 不再自动调用 metabase.driver-api.core/add-alias-info 来处理其结果,但它也不再期望其输入包含此信息。如果你同时使用了这两个工具,请更改它们的应用顺序,以便 nest-query 先发生,然后是 add-alias-info。请注意,派生自 :sql 的驱动程序不需要进行任何更改,因为这是由基础 :sql 驱动程序实现的。

Metabase 0.56.3

  • 添加了驱动程序多方法 driver/describe-database*,驱动程序现在应该实现它,而不是 driver/describe-database。这提供了自动弹性连接处理,以便在元数据同步期间数据库连接关闭时更好地进行错误恢复。现有的实现 describe-database 的驱动程序将继续工作,但应迁移到 describe-database* 以利用弹性连接处理。

Metabase 0.56.0

  • 添加了测试多方法 tx/track-dataset,用于共享云数据库以跟踪加载的数据集,实现更高效的共享。

  • 连接别名转义已重构;在编译 join 的 MBQL 时,请使用 metabase.driver-api.core/qp.add.alias 而不是 :join-alias。(这主要与自定义 metabase.driver.sql.query-processor/join->honeysql 实现相关。)

    连接别名默认不再是全局唯一的,而是在一个查询层级内是唯一的。如果你需要全局唯一的连接别名,可以将新的 {:globally-unique-join-aliases? true} 选项传递给 driver-api/add-alias-info

    另请注意,driver-api/add-alias-info 只向字段引用和连接映射添加额外的键,并且不替换现有的键,如 :alias:join-alias:name;请确保你分别使用 driver-api/qp.add.aliasdriver-api/qp.add.source-tabledriver-api/qp.add.source-alias

  • 添加了驱动程序多方法 driver/extra-info,供驱动程序提供其 metabase-plugin.yaml 文件中的数据库路由配置详细信息等信息。

  • datetime() 扩展为除了字符串之外,还可以接受 UTF-8 编码的二进制和数字(Unix 时间戳)。

  • 为支持生成当前日期(today)的驱动程序添加了一个功能 :expressions/today

  • 添加了驱动程序多方法 driver/set-database-used!,供驱动程序使用 USE DATABASE 等语句在连接上设置数据库。

  • 添加了驱动程序功能 :transforms/table,供支持以表为目标的转换的驱动程序使用。

Metabase 0.55.9

  • 添加了多方法 driver/do-with-resilient-connection,用于在可能自动重新打开关闭连接的环境中执行函数。

Metabase 0.55.0

  • 添加了多方法 ->date,它允许驱动程序控制如何将字符串和时间类型转换为日期。

  • 添加了多方法 date-dbtype,它允许驱动程序控制日期被转换为哪种类型。

  • date() 扩展为除了 ISO 字符串之外,还可以接受 DateTime(或 DB 等效项)。当给定 DateTime 时,它将被截断为日期。

  • 为支持将 ISO 字符串转换为日期时间(datetime)的驱动程序添加了一个功能 :expressions/datetime

  • 为支持由单个字符串、数字或布尔值字面量组成的表达式的驱动程序添加了一个功能 :expression-literals

  • 为支持数据库和模式之间存在分层级别的驱动程序添加了一个功能 :multi-level-schema,例如 Databricks 的 catalog。默认为 false。

  • 添加了多方法 adjust-schema-qualification,它允许驱动程序根据启用或禁用多级模式支持来限定或取消限定表模式。驱动程序可能需要实现 sql.qp/->honeysql [driver ::h2x/identifier] 来正确地引用完全限定的模式。

  • 添加了多方法 float-dbtype,它返回我们用于强制转换策略和 float() 自定义表达式函数的浮点类型名称。

  • 为支持将文本转换为浮点数(float)的驱动程序添加了一个功能 :expressions/float

  • 添加了多方法 integer-dbtype,它允许驱动程序控制整数被转换为哪种类型。

  • metabase.upload 命名空间已被替换为 metabase.upload.core,但上传类型关键字,例如 :metabase.upload/varchar-255 保持不变。确保您没有在 metabase.driver/upload-type->database-typemetabase.driver/allowed-promotions 等方法中使用 :: 关键字——确保您使用 :metabase.upload/varchar-255 而不是 ::upload/varchar-255 之类的。

  • metabase.models.secret 命名空间已被替换为 metabase.secrets.core;如果您曾经使用过它,请更新您的用法。

  • metabase.public-settings 命名空间已被移除,设置已移动到相应的模块,例如 site-uuid 现在位于 metabase.system.core。如果您曾使用过此命名空间,请相应地更新您的代码。您应该能够通过查看这些设置在我们第一方驱动程序中的用法来找到正确的设置。

  • metabase.models.fieldmetabase.models.field-valuesmetabase.models.table 命名空间已分别移动到 metabase.warehouse-schema.fieldmetabase.warehouse-schema.field-valuesmetabase.warehouse-schema.table。您不应该直接在驱动程序中使用这些命名空间,但如果您使用了,请更新您的引用。

  • metabase.driver.sql.query-processor/->honeysql 不再支持 :model/Table(此支持已在 0.48.0 中弃用)——此方法将不再使用;如果您有此类方法,请将其迁移到 :metadata/table。如果您有一个 :model/Table 并且需要 :metadata/table(例如在 metabase.driver/table-rows-seq 的实现中),您可以使用 metabase.lib.metadata/table

  • metabase.db.metadata-queries 已被移除;供驱动程序使用部分已移动到 metabase.driver.common.table-rows-sample

  • metabase.util.ssh 已移动到 metabase.driver.sql-jdbc.connection.ssh-tunnel

  • metabase.query-processor.pipeline/*query-timeout-ms* 已移动到 metabase.driver.settings/*query-timeout-ms*

  • 已移除在 0.50.0 中弃用的 metabase.query-processor.context 命名空间。

  • 所有之前位于 metabase.driver.* 命名空间中的设置已移动到 metabase.driver.settings,所有之前位于 metabase.query-processor.* 命名空间中的设置已移动到 metabase.query-processor.settings

Metabase 0.54.12

  • 函数 metabase.driver.sql-jdbc.sync/describe-table-fields-xf 现在接受表而不是数据库

Metabase 0.54.11

  • 多方法 metabase.driver.sql-jdbc.sync.interface/active-tablesmetabase.driver.sql-jdbc.sync.interface/filtered-syncable-schemas,以及函数 metabase.driver.sql-jdbc.sync.describe_database/fast-active-tablesmetabase.driver.sql-jdbc.sync.describe_database/have-select-privilege-fnmetabase.driver.sql-jdbc.sync.describe_database/db-tables 现在接受数据库规范而不是 java.sql.Connection 对象。

Metabase 0.54.10

  • 添加 metabase.driver/table-known-to-not-exist?,供驱动程序测试异常是否由于查询一个已不存在的表而引起。
  • 为 JDBC 驱动程序添加 metabase.driver.sql-jdbc/impl-table-known-to-not-exist?。这是 jdbc 的 table-known-to-not-exist 的实现,允许直接测试 java.sql.SQLException 可抛出项,而无需担心异常原因链。

Metabase 0.54.0

  • 添加了多方法 allowed-promotions,它允许驱动程序控制上传支持的列类型提升。

  • 添加了多方法 alter-table-columns!,类似于 alter-columns!,但接受额外的关键字参数选项。现有的 alter-columns! 实现将默认使用。

  • alter-columns! 现在被标记为已弃用。驱动程序应寻求实现新的 alter-table-columns! 方法。

  • 添加了多方法 metabase.driver.sql-jdbc.sync.interface/alter-table-columns-sql,类似于 alter-columns-sql,但接受额外的关键字参数选项。现有的 alter-columns-sql 实现将默认使用。

  • metabase.driver.sql-jdbc.sync.interface/alter-columns-sql 现在被标记为已弃用。驱动程序应寻求实现新的 alter-table-columns-sql 方法。

  • 添加了一个功能 :test/arrays 和多方法 native-array-query,以支持数组类型的数据库测试。

  • 为支持转换为文本(text)的驱动程序添加了一个功能 :expressions/text

  • 为支持将文本(text)转换为日期(date)的驱动程序添加了一个功能 :expressions/date

  • 为支持将文本(text)转换为整数(integer)的驱动程序添加了一个功能 :expressions/integer

  • 为支持 distinct-where 函数的驱动程序添加了一个功能 :distinct-where

  • 为支持 split-part 函数的驱动程序添加了一个功能 :split-part

Metabase 0.53.12

  • 添加 metabase.driver/query-canceled?,供驱动程序测试异常是否是由于查询被用户操作取消。
  • 为 JDBC 驱动程序添加 metabase.driver.sql-jdbc/impl-query-canceled?。这是 jdbc 的 query-canceled 的实现,允许直接测试 java.sql.SQLException 可抛出项,而无需担心异常原因链。

Metabase 0.53.10

  • 为 JDBC 驱动程序添加了 metabase.driver.sql-jdbc.sync/describe-fields-pre-process-xf。这允许在不重新实现 driver/describe-fields 的情况下操纵 metabase.driver.sql-jdbc.sync/describe-fields-sql 的结果。

Metabase 0.53.0

  • 添加了多方法 bad-connection-details,以允许为测试模拟不正确的连接参数。

  • 添加了 driver/dynamic-database-types-lookup 及其 :postgres 实现。该方法生成一个 database_typebase_type 的映射,用于动态类型,即那些未被 sql-jdbc.sync/database-type->base-type 覆盖的类型。其原始目的是为了使 PostgreSQL 中用户定义的枚举映射到结果元数据中适当的基本类型。

Metabase 0.52.12

  • 添加了多方法 metabase.driver/db-details-to-test-and-migrate。这可用于清理和迁移早期版本中的模糊连接详细信息。

Metabase 0.52.0

  • Metabase 0.52.0 的 Docker 镜像现在使用 Java 21 而不是 Java 11。请确保在 Java 21 上测试您的驱动程序,并确保其按预期工作。

    我们发现我们自己的几个驱动程序在新版 JVM 引入的安全更改方面遇到了问题;因此,我们目前正在设置 JVM 标志

    --add-opens java.base/java.nio=ALL-UNNAMED
    

    在运行 Metabase 时禁用其中一些新的安全检查。如果您的测试在没有设置该标志的情况下运行 Java 21 时遇到问题,请尝试设置该标志运行——这可能会解决问题。

Metabase 0.51.4

  • 又添加了一个驱动程序功能:describe-indexes。如果驱动程序选择支持此功能,则必须实现多方法 metabase.driver/describe-indexes,作为 metabase.driver/describe-table-indexes 的替代。

  • 添加了多方法 metabase.driver.sql-jdbc.sync.describe-table/describe-indexes-sql。如果驱动程序支持 describe-indexes 并且您想使用 metabase.driver/describe-indexes 的默认 JDBC 实现,则需要实现此方法。

Metabase 0.51.0

  • 添加了新的可选方法 metabase.driver/query-result-metadata,用于在不实际运行查询的情况下高效计算查询的元数据。:sql-jdbc 已获得默认实现;不支持此功能的非基于此的驱动程序,如果它们可以在不实际运行查询的情况下确定结果元数据,也应该添加其实现以提高保存问题时的性能。有关更多信息以及如何查找示例实现,请参阅方法文档字符串。

  • 在 0.51.0 之前,要生成带有内联参数的 SQL 查询,Metabase 会生成一个参数化的 SQL 字符串,然后尝试解析 SQL 并使用驱动程序方法 metabase.driver.sql.util.unprepare/unprepare-value 中的内联值替换 ? 占位符。在 0.51.0+ 中,Metabase 改用 Honey SQL 2 的 :inline 选项生成这些查询,从而无需解析和替换 ? 占位符。因此,metabase.driver.sql.util.unprepare 命名空间已被弃用;您应该删除在驱动程序中的所有用法。

  • metabase.driver.sql.util.unprepare/unprepare-value 方法已被新方法 metabase.driver.sql.query-processor/inline-value 取代。这两个函数的签名相同,您应该只需将所有 unprepare-value 实现更改为 inline-value 即可。有关此更改的示例,请参阅 PR #45008

    目前,unprepare-value 的实现会自动用作 inline-value 的实现,但 unprepare-value 定于在 0.54.0 中移除。

  • metabase.driver.sql.query-processor/format-honeysql 现在是一个多方法,主要是为了让您可以在需要始终在没有参数化的情况下进行编译时绑定 *compile-with-inline-parameters*

  • 已添加动态变量 metabase.driver/*compile-with-inline-parameters*(默认为 false);能够生成参数化查询的驱动程序应在其 metabase.driver/mbql->native 实现中查看其值并相应地调整其输出。对于支持参数化的 :sql-jdbc 基于的驱动程序,这在共享的 metabase.driver.sql.query-processor 代码中处理,因此您无需在此处进行任何调整。对于不支持 JDBC 风格参数化查询的 :sql 驱动程序,您可以实现 format-honeysql 并如上所述绑定 *compile-with-inline-parameters*。有关如何执行此操作的示例,请参阅 :athena 驱动程序。

  • 已移除 metabase.driver.sql.util.unprepare/unprepare,该函数接受一个参数化的 SQL 字符串并将其去参数化或“取消准备”。相反,如果您需要一个参数直接插入 SQL 中的查询,请如上所述绑定 metabase.driver/*compile-with-inline-parameters*

  • 同样,驱动程序方法 metabase.driver/splice-parameters-into-native-query 已被标记为已弃用,并且默认实现将在调用时抛出异常。重构生成参数化查询然后调用 unpreparesplice-parameters-into-native-query 的代码,使用直接生成内联参数的查询的代码,如上所述。如果需要,测试可以使用 metabase.query-processor.compile/compile-with-inline-parameters

  • 已移除 metabase.query-processor.compile/compile-and-splice-parameters;将用法替换为 metabase.query-processor.compile/compile-with-inline-parameters

  • 已移除 metabase.driver.sql.query-processor/format-honeysql 的三参数版本(它还有一个额外的 Honey SQL 版本参数);请将所有用法替换为双参数版本。自 Metabase 0.49.0 起,Honey SQL 2 一直是唯一支持的版本。

  • 用于加载和销毁测试数据的某些方法的 :skip-drop-db? 选项已不再传递,您可以删除检查它的代码。测试数据代码现在能更好地避免不必要/冗余地调用 metabase.test.data.interface/create-db!,因此测试数据加载代码不需要在加载测试数据之前调用 DROP DATABASE IF EXISTS

  • 基于 JDBC 的数据库的测试数据加载已进行了一些重构。已移除 metabase.test.data.sql-jdbc.load-data/load-data! 多方法及其辅助函数,取而代之的是几个新的、更易于组合和理解的多方法。

  • metabase.test.data.sql-jdbc.load-data/row-xform 是在加载测试数据时应用于每一行的转换器。默认实现为 identity,但您可以使用 metabase.test.data.sql-jdbc.load-data/add-ids-xform 为每一行添加 ID(这取代了已移除的 metabase.test.data.sql-jdbc.load-data/load-data-add-ids 函数)以及 metabase.test.data.sql-jdbc.load-data/maybe-add-ids-xform(它取代了 metabase.test.data.sql-jdbc.load-data/load-data-maybe-add-ids!metabase.test.data.sql-jdbc.load-data/load-data-maybe-add-ids-chunked!)。

  • metabase.test.data.sql-jdbc.load-data/chunk-size 用于控制每批加载的行数。默认值为 200,但您可以实现此方法并返回 nil 以一次性加载所有数据,而不管行数。不再需要 metabase.test.data.sql-jdbc.load-data/*chunk-size*metabase.test.data.sql-jdbc.load-data/load-data-chunkedmetabase.test.data.sql-jdbc.load-data/load-data-all-at-once!metabase.test.data.sql-jdbc.load-data/load-data-chunked! 以及其他类似函数,并且已将其移除。

  • metabase.test.data.sql-jdbc.load-data/chunk-xform 是一个转换器,应用于每一批行(取决于 chunk-size)或整个行组(如果 chunk-sizenil)。默认值为 identity。它可以用于为每个块实现特殊行为,例如将块写入 CSV 文件,然后在 metabase.test.data.sql-jdbc.load-data/do-insert! 方法中加载。有关此示例,请参阅 metabase.test.data.vertica

  • 现在连接被创建一次并在大部分测试数据加载过程中重用。 metabase.test.data.sql-jdbc.load-data/do-insert! 的第二个参数现在是 java.sql.Connection 而不是 clojure.java.jdbc 规范。

  • 同样,metabase.test.data.sql-jdbc.execute/execute-sql! 和辅助函数如 metabase.test.data.sql-jdbc.execute/sequentially-execute-sql! 现在使用 java.sql.Connection 调用,而不是 DatabaseDefinition:server:db *上下文*;适当的连接类型会自动创建并传入调用代码。请相应地更新您的方法实现和用法。

  • 添加了方法 metabase.test.data.interface/dataset-already-loaded? 来检查测试数据集是否已加载。基于 JDBC 的驱动程序有一个默认实现,用于检查我们是否可以连接到数据库;您可能需要为不实际在测试中创建新数据库的驱动程序覆盖此方法。您可以通过运行测试 metabase.test.data.sql-jdbc-test/dataset-already-loaded?-test 来检查您的基于 JDBC 的驱动程序是否正常工作。

  • metabase.test.data.sql.ddl/insert-rows-ddl-statements 已重命名为 metabase.test.data.sql.ddl/insert-rows-dml-statements,因为 INSERT 是 DML,而不是 DDL。请相应地更新您的方法实现。

  • 已删除 `:foreign-keys` 驱动程序功能。对于在同步期间报告外键关系的驱动程序,应使用 `:metadata/keys-constraints`。隐式连接现在依赖于 `:left-join` 功能。对于基于 `:sql` 的驱动程序,默认值为 true。现在,所有连接功能默认都为基于 `:sql` 的驱动程序启用。以前,这些功能依赖于 `:foreign-keys` 功能。如果您的驱动程序支持 `:left-join`,现在将执行重新映射和隐式连接的测试。

  • 已添加 `:parameterized-sql` 驱动程序功能,以区分不支持参数化 SQL 的驱动程序。目前,此功能仅对 `:sparksql` 禁用。

  • 已删除测试方法 `metabase.test.data.interface/supports-time-type?` 和 `metabase.test.data.interface/supports-timestamptz-type?`,并分别替换为功能 `:test/time-type` 和 `:test/timestamptz-type`。如果您实现了这些方法,请将实现替换为您的驱动程序的 `metabase.driver/database-supports?` 的实现以及等效的功能关键字。

  • 使用 `metabase.driver.sql.query-processor/->honeysql` 的驱动程序可以实现 `:metabase.driver.sql.query-processor/nfc-path` 以将 nfc-path 包含在字段标识符中。这样,记录类字段就可以用 `..` 来引用。有关示例,请参阅 `bigquery-cloud-sdk`。默认值为 `nil`,表示路径不应成为标识符的一部分。

  • 已添加 `:test/dynamic-dataset-loading` 功能。它使驱动程序能够在运行时退出需要创建新的、未预加载的数据集的测试。

  • 已添加 `:temporal/requires-default-unit` 功能。对于大多数驱动程序,它应该为 false,但对于少数驱动程序(如旧的、JDBC 之前的 Druid 驱动程序)来说,它对于查找所有时间字段引用并为其设置 `:temporal-unit :default` 是必需的。以前,此默认设置适用于所有驱动程序,但这带来了一些下游问题,因此现在只有需要它的驱动程序才能设置此功能。

Metabase 0.50.17

  • 已添加 `metabase.driver/incorporate-auth-provider-details` 方法,用于处理将身份提供者的响应合并到数据库详细信息中所需的特定于驱动程序的行为。在大多数情况下,这意味着根据身份提供者及其响应设置 `:password` 和/或 `:username`。

Metabase 0.50.16

  • `:type/fingerprinting-unsupported` 已添加到 `metabase.types` 命名空间。与用于字段值扫描的 `:type/field-values-unsupported` 类似,它用于确定是否应计算特定字段的指纹。在撰写本文时,该逻辑在 `metabase.sync.analyze.fingerprint/fields-to-fingerprint-base-clause` 中执行。

  • `:type/Large` 也已添加到 `metabase.types` 命名空间。驱动程序作者可以使用它来指示特定字段包含足够大的值,从而可以跳过指纹识别或字段值扫描。将来也可以用于其他目的。示例包括 Oracle CLOB 或 Postgres JSON 列。

Metabase 0.50.0

  • Metabase `metabase.mbql.*` 命名空间已移至 `metabase.legacy-mbql.*`。您的驱动程序很可能不需要使用这些命名空间,但如果使用了,请更新它们。

  • 已添加多方法 `metabase.driver/truncate!`。此方法用于以最高效的方式删除表中的行。目前,这仅适用于支持 `:uploads` 功能的驱动程序,并且对于基于 JDBC 的驱动程序有一个默认实现。

  • 已添加新功能 `:window-functions/cumulative`。实现此方法的驱动程序应在其原生查询语言中实现累积总和 (`:cum-sum`) 和累积计数 (`:cum-count`) 聚合子句。对于非 SQL 驱动程序(非基于我们的 `:sql` 或 `:sql-jdbc` 驱动程序的驱动程序),此功能标志默认设置为 `false`;将继续使用旧的(损坏的)后处理实现来处理累积聚合。(有关旧实现为何损坏的更多信息,请参阅 issue #13634#15118。)

    应更新非 SQL 驱动程序,以便在可能的情况下在本地实现累积聚合。

    SQL 实现使用 `OVER (...)` 表达式。它将自动将 `GROUP BY` 表达式(如 `date_trunc()`)移至 `SUBSELECT`,以便像 BigQuery 这样挑剔的数据库可以引用纯列标识符。生成的实际 SQL 将类似于:

    SELECT
      created_at_month,
      sum(sum(total) OVER (ORDER BY created_at_month ROWS UNBOUNDED PRECEDING) AS cumulative_sum
    FROM (
      SELECT
        date_trunc('month', created_at) AS created_at_month,
        total
      FROM
        my_table
      ) source
    GROUP BY
      created_at_month
    ORDER BY
      created_at_month
    

    非 SQL 驱动程序可以使用 `metabase.query-processor.util.transformations.nest-breakouts/nest-breakouts-in-stages-with-window-aggregation` 来利用相同的查询转换。请参阅 `metabase.driver.sql.query-processor/preprocess` 的默认 `:sql` 实现,了解在需要时使用此转换的示例。

    您可以运行 `metabase.query-processor-test.cumulative-aggregation-test` 中的新测试来验证您的驱动程序实现是否正常工作。

  • `metabase.driver.common/class->base-type` 不再支持 Joda Time 类。自 2019 年以来,它们已被弃用。

  • 已添加新功能 `:window-functions/offset`,以表示驱动程序支持新的 MBQL `:offset` 子句(相当于 SQL `lead` 和 `lag` 函数)。此功能默认对基于 `:sql` 和 `:sql-jdbc` 的驱动程序启用。其他驱动程序应为此子句添加实现并启用功能标志。

  • `:type/field-values-unsupported` 已添加到 `metabase.types` 命名空间。它用于字段值计算逻辑,以确定是否应计算特定字段的值。在撰写本文时,这在 `metabase.models.field-values/field-should-have-field-values?` 中执行。通过推导,驱动程序开发人员可以为与用于计算的查询不兼容的字段排除字段值计算。例如,Druid 的 `COMPLEX` 数据库类型字段。请参阅 `metabase.driver.druid-jdbc` 中 `sql-jdbc.sync/database-type->base-type` 的 `:druid-jdbc` 实现以及 `metabase.types` 命名空间中的派生项作为示例。

  • 已添加新功能 `:metadata/key-constraints`,以表示驱动程序支持在架构级别定义和强制执行外键约束。这比 `:foreign-keys` 的条件更强。某些数据库(如 Presto、Athena 等)支持 over 外键关系的 *查询* (`:foreign-keys`),但不在模式中跟踪或强制执行这些关系。默认情况下,对于 `:sql` 和 `:sql-jdbc` 驱动程序为 `true`;对于第一方 SparkSQL、Presto 和 Athena 驱动程序,设置为 `false`。

  • 已添加新功能 `:connection/multiple-databases`,以指示到此驱动程序的 *连接* 是否对应多个数据库,而不仅仅是一个。默认值为 `false`,其中一个连接指定单个数据库。这是 Postgres 等经典关系型数据库以及某些云数据库的常见情况。相反,Athena 等驱动程序将其设置为 `true`,因为它们连接到 S3 存储桶并将其中每个文件视为一个数据库。

  • 已添加新功能 `:identifiers-with-spaces`,以指示驱动程序是否支持包含空格字符的标识符(如表名或列名)。默认值为 `false`。

  • 已添加新功能 `:uuid-type`,以表示该数据库可以区分和过滤 UUID。只有少数数据库支持本机 UUID 类型。默认值为 `false`。

Metabase 0.49.22

  • 已添加一个新的可选方法 `metabase.driver.sql/json-field-length`。它应为所有派生自 `:sql` 并支持 `:nested-field-columns` 功能的驱动程序实现。如果已实现,Metabase 将在“sync-fields”步骤中跳过查询大型 JSON 值,否则该步骤会减慢嵌套字段列的推断速度并导致 Metabase 耗尽堆空间。

Metabase 0.49.9

  • 已添加另一个驱动程序功能:`upload-with-auto-pk`。它仅影响支持 `uploads` 的驱动程序,并且是可选的。驱动程序默认支持此功能,如果无法创建带有自动增量整数列的表,可以选择不支持它。驱动程序可以使用 `driver/database-supports?` 覆盖默认值。

Metabase 0.49.1

  • 已添加另一个驱动程序功能:`describe-fields`。如果驱动程序选择支持此功能,则必须实现多方法 `metabase.driver/describe-fields`,以替代 `metabase.driver/describe-table`。

  • 已添加多方法 `metabase.driver.sql-jdbc.sync.describe-table/describe-fields-sql`。如果驱动程序支持 `describe-fields` 并且您想使用 `metabase.driver/describe-fields` 的默认 JDBC 实现,则需要实现此方法。

Metabase 0.49.0

  • 多方法 `metabase.driver/describe-table-fks` 已弃用,取而代之的是 `metabase.driver/describe-fks`。`metabase.driver/describe-table-fks` 将在 0.52.0 中移除。

  • 已添加多方法 `metabase.driver/describe-fks`。如果数据库支持 `:foreign-keys` 和 `:describe-fks` 功能,则需要实现此方法。它取代了现已弃用的 `metabase.driver/describe-table-fks` 方法。

  • 已添加多方法 `metabase.driver.sql-jdbc.sync.describe-table/describe-fks-sql`。如果您想使用 `metabase.driver/describe-fks` 的默认 JDBC 实现,则需要实现此方法。

  • 已添加多方法 `metabase.driver/alter-columns!`。此方法用于在数据库中修改表的列。目前,这仅适用于支持 `:uploads` 功能的驱动程序,并且对于基于 JDBC 的驱动程序有一个默认实现。

  • 已添加多方法 `metabase.driver.sql-jdbc.sync.interface/alter-columns-sql`。此方法允许您自定义 `metabase.driver/alter-columns!` 的默认 JDBC 实现使用的查询。

  • 已添加多方法 `metabase.driver.sql-jdbc.sync.interface/current-user-table-privileges`。基于 JDBC 的驱动程序可以实现此方法,以提高 `metabase.driver/describe-database` 的默认 SQL JDBC 实现的性能。如果数据库支持 `:table-privileges` 功能且驱动程序是基于 JDBC 的,则需要实现此方法。

  • 多方法 `metabase.driver/create-table!` 现在可以接受一个额外的可选映射,其中包含一个可选键 `primary-key`。`metabase.driver/upload-type->database-type` 也必须进行更改,以便如果 `:metabase.upload/auto-incrementing-int-pk` 作为 `upload-type` 参数提供,则函数应返回一个不包含主键约束的类型。有关更多信息,请参阅 PR #22166。只有当数据库支持 `:uploads` 功能时,才需要实现这些更改。

  • 已添加多方法 `metabase.driver/create-auto-pk-with-append-csv?`。如果数据库在 47 或更早版本中支持 `:uploads` 功能,则仅需实现此方法,并应返回 true。

  • 已添加多方法 `metabase.driver/add-columns!`。此方法用于在数据库中向表中添加列。只有当数据库在 47 或更早版本中支持 `:uploads` 功能时,才需要实现此方法。

  • 已添加新的驱动程序方法 `metabase.driver/describe-table-indexes` 以及新功能 `:index-info`。此方法用于获取一组被索引的列名,或者作为复合索引的第一个列名。

  • `metabase.util.honeysql-extensions` 在 0.46.0 中被弃用,现已移除。不再支持使用 Honey SQL 1 的基于 SQL 的驱动程序。有关更多信息,请参阅 0.46.0 注释。`metabase.driver.sql.query-processor/honey-sql-version` 现在已弃用且不再调用。所有驱动程序都假定使用 Honey SQL 2。

  • 方法 `metabase.driver.sql.parameters.substitution/align-temporal-unit-with-param-type` 现在已弃用。请改用 `metabase.driver.sql.parameters.substitution/align-temporal-unit-with-param-type-and-value`,该方法可以访问 `value`,从而为选择正确的转换单位提供更大的灵活性。

Metabase 0.48.0

  • `metabase.mbql.schema` 中的 MBQL 模式现在使用 Malli 而不是 Schema。如果您结合 Schema 使用此命名空间,则需要更新代码以改用 Malli。

  • 已添加另一个驱动程序功能:`:table-privileges`。此功能指示我们是否可以在数据库同步时存储数据库的表级权限。

  • 已添加多方法 `metabase.driver/current-user-table-privileges`。此方法用于获取数据库连接的当前用户拥有的权限集。如果数据库支持 `:table-privileges` 功能,则需要实现此方法。

  • `metabase.query-processor.store` ( `qp.store`) 中的以下函数现已弃用:

    • qp.store/database
    • qp.store/table
    • qp.store/field

    将用法更新为 `metabase.lib.metadata` ( `lib.metadata`) 中的相应函数。

    (qp.store/database)       => (lib.metadata/database (qp.store/metadata-provider))
    (qp.store/table table-id) => (lib.metadata/table (qp.store/metadata-provider) table-id)
    (qp.store/field field-id) => (lib.metadata/field (qp.store/metadata-provider) field-id)
    

    请注意,新方法返回的键是 `kebab-case` 而不是 `snake_case`。

  • 同样,驱动程序不应直接访问应用程序数据库(通过 `toucan` 函数或其他方式);而是使用 `lib.metadata` 函数。在未来的版本中,此访问可能会被阻止。

  • 实现 `metabase.driver.sql.query-processor/->honeysql` 用于 `metabase.models.table/Table` / `:model/Table` 的 SQL 驱动程序应更新为改为实现 `:metadata/table`。与上述更改一样,主要区别在于新的元数据映射使用 `kebab-case` 键而不是 `snake_case` 键。

  • `metabase.driver.sql.query-processor/cast-field-if-needed` 现在期望一个由 `lib.metadata/field` 返回的 `kebab-case` 字段。

  • `metabase.query-processor.store/fetch-and-store-database!`、`metabase.query-processor.store/fetch-and-store-tables!` 和 `metabase.query-processor.store/fetch-and-store-fields!` 已移除。现在会根据需要自动获取数据,因此不再需要这些调用。

  • `metabase.models.field/json-field?` 已移除,请改用 `metabase.lib.field/json-field?`。请注意,新函数接受由 `lib.metadata/field` 返回的 Field,即 `kebab-case` 映射。

  • 测试应尽量避免使用任何 `with-temp` 辅助函数或应用程序数据库对象;而是使用上述元数据函数以及 `metabase.lib`、`metabase.lib.test-util` 和 `metabase.query-processor.test-util` 中的辅助 *元数据提供程序* 来模拟它们,例如 `mock-metadata-provider`、`metabase-provider-with-cards-for-queries`、`remap-metadata-provider` 和 `merged-mock-metadata-provider`。

  • `metabase.query-processor.util.add-alias-info/field-reference` 现在已弃用。如果您的驱动程序实现了它,请改用 `metabase.query-processor.util.add-alias-info/field-reference-mlv2`。两者之间的唯一区别是后者传递的 Field 元数据具有 `kebab-case` 键,而前者传递的为具有 `snake_case` 键的旧元数据。

  • `metabase.driver/current-db-time`(在 0.34 中已弃用)及相关方法和辅助函数已被移除。请改用 `metabase.driver/db-default-timezone`。

  • `metabase.driver.sql-jdbc.sync.interface/db-default-timezone`(用于为基于 JDBC 的驱动程序编写 `metabase.driver/db-default-timezone` 实现的辅助函数)已弃用,并计划在 Metabase 0.50.0 或更高版本中移除。您可以直接轻松地实现 `metabase.driver/db-default-timezone`,并使用 `metabase.driver.sql-jdbc.execute/do-with-connection-with-options` 来获取 `java.sql.Connection`。

  • 已添加新的多方法 `metabase.driver.sql.parameters.substitution/align-temporal-unit-with-param-type`,它返回一个适合 `field`、`param-type` 和给定驱动程序的临时单位转换关键字。返回的关键字将用于调用相应的 `metabase.driver.sql.query-processor/date` 实现来转换 `field`。如果对于此 `field` 和 `param-type` 组合不需要转换,则返回 `nil`。

  • 已添加多方法 `metabase.driver.sql-jdbc.execute/inject-remark`。它允许基于 JDBC 的驱动程序覆盖如何将 SQL 查询备注添加到查询的默认行为(将其作为注释添加到前面)。

  • 多方法 `metabase.driver.sql-jdbc.sync.interface/fallback-metadata-query` 的元数已从 3 更新为 4,现在它接受一个额外的 `db` 参数。新函数参数为:`[driver db-name-or-nil schema table]`。

Metabase 0.47.0

  • 已添加新的驱动程序功能:`:schemas`。此功能指示数据库是否(也称为命名空间)以模式的形式组织表。大多数数据库都有模式,因此此功能默认启用。只有当数据库不以模式存储表时,才需要为 `:schemas` 实现 `metabase.driver/database-supports?` 多方法。

  • 已添加另一个驱动程序功能:`:uploads`。`:uploads` 功能指示数据库是否支持将 CSV 文件上传到数据库中的表。要支持 uploads 功能,请实现以下新多方法:`metabase.driver/create-table!`(创建表)、`metabase.driver/drop-table!`(删除表)和 `metabase.driver/insert-into!`(将值插入表中)。

  • 已添加多方法 `metabase.driver/syncable-schemas`。此方法用于列出要上传 CSV 的模式,并且应包含所有可同步的模式。目前,只有当数据库具有模式且数据库支持 `:uploads` 功能时,才需要实现它。

  • 多方法 `metabase.driver/supports?` 已弃用,取而代之的是 `metabase.driver/database-supports?`。`database-supports?` 的现有默认实现目前调用 `supports?`,但它将在 0.50.0 中移除。

  • `metabase.driver.sql-jdbc.execute/connection-with-timezone` 已被标记为弃用,并计划在 Metabase 0.50.0 中移除。新方法 `metabase.driver.sql-jdbc.execute/do-with-connection-with-options` 取代了它。迁移到新方法很简单。有关更多信息,请参阅 PR #22166。以后应使用 `metabase.driver.sql-jdbc.execute/do-with-connection-with-options` 而不是 `clojure.java.jdbc/with-db-connection` 或 `clojure.java.jdbc/get-connection`。

  • 已添加多方法 `set-role!`、`set-role-statement` 和 `default-database-role`。这些方法用于启用连接模拟,这是 0.47.0 中添加的新功能。连接模拟允许将用户分配给特定的数据库角色,这些角色在执行任何查询之前设置,以便可以在数据库级别而不是(或与)Metabase 的内置权限系统限制对表的访问。

  • 多方法 `metabase.driver.sql-jdbc.sync.describe-table/get-table-pks` 已更改为返回向量而不是集合。

  • 函数 `metabase.query-processor.timezone/report-timezone-id-if-supported` 已更新,以接受一个额外的 `database` 参数,该参数先前只有一个参数。此函数可能在驱动程序的多个方法实现中使用。

  • 已添加 `metabase.driver/prettify-native-form`,以使驱动程序开发人员能够使用特定于其驱动程序的原生格式化。有关详细信息,请参阅 PR #34991

Metabase 0.46.0

  • Metabase 0.46.0 中构建驱动程序的过程略有变化。您的构建命令现在应如下所示:

    # Example for building the driver with bash or similar
    
    # switch to the local checkout of the Metabase repo
    cd /path/to/metabase/repo
    
    # get absolute path to the driver project directory
    DRIVER_PATH=`readlink -f ~/sudoku-driver`
    
    # Build driver. See explanation in sample Sudoku driver README
    clojure \
      -Sdeps "{:aliases {:sudoku {:extra-deps {com.metabase/sudoku-driver {:local/root \"$DRIVER_PATH\"}}}}}"  \
      -X:build:sudoku \
      build-drivers.build-driver/build-driver! \
      "{:driver :sudoku, :project-dir \"$DRIVER_PATH\", :target-dir \"$DRIVER_PATH/target\"}"
    

    请查看我们的 示例 Sudoku 驱动程序的构建说明,了解该命令的说明。

    请注意,虽然此命令本身输入量很大,但您不再需要在驱动程序的 `deps.edn` 文件中指定 `:build` 别名。

    请为 https://ask.clojure.org/index.php/7843/allow-specifying-aliases-coordinates-that-point-projects 投票,这将允许我们简化将来的驱动程序构建命令。

  • 已添加多方法 `metabase.driver/table-rows-sample`。此方法用于 Metabase 需要从表中获取有限样本的情况,例如在指纹识别时。在 `metabase.db.metadata-queries` 命名空间中定义的默认实现使用常规查询处理器运行 MBQL 查询以生成样本行。在大多数情况下,这已足够,因此除非真正需要,否则不应实现此多方法。目前,仅当它是 BigQuery 时才使用特殊实现,因为 BigQuery 不尊重 limit 子句。

  • 已添加多方法 `metabase.driver.sql.query-processor/datetime-diff`。此方法由 `:datetime-diff` 子句的 `->honeysql` 实现使用。如果您想使用 `:datetime-diff` 的默认 SQL 实现(包括跨所有单元的参数类型验证),建议实现此方法。

  • 已添加多方法 `metabase.query-processor.util.add-alias-info/field-reference`。此方法用于由 `add-alias-info` 中间件生成对字段的引用。(请注意,此中间件是可选的,目前仅由 SQL 和 MongoDB 驱动程序使用。)默认实现返回字段实例的名称。如果仅名称不是有效引用,则应进行重写。例如,MongoDB 支持嵌套文档,对嵌套字段的引用应包含整个路径。请参阅 `metabase.driver.mongo.query-processor` 命名空间以获取替代实现。

  • `metabase.driver.sql-jdbc.sync.interface/syncable-schemas`(别名 `metabase.driver.sql-jdbc.sync/syncable-schemas`)多方法已在 0.43.0 中弃用,现已移除。请改用 `metabase.driver.sql-jdbc.sync.interface/filtered-syncable-schemas`。有关更多详细信息,请参阅下面的 0.43.0 注释。

  • `metabase.driver/format-custom-field-name` 多方法在 0.42.0 中已弃用,现已移除。请改用 `metabase.driver/escape-alias`。有关更多信息,请参阅下面的 0.42.0 注释。

  • `metabase.driver.sql-jdbc.execute/read-column` 多方法在 0.35.0 中已弃用,现已移除。请改用 `metabase.driver.sql-jdbc.execute/read-column-thunk`。有关更多信息,请参阅下面的 0.35.0 注释。

Honey SQL 2

以下仅适用于 SQL 驱动程序;非 SQL 驱动程序可以忽略。

在 Metabase 0.46.0 之前,SQL 驱动程序使用 Honey SQL 1 作为编译查询时的中间目标。在 0.46.0 中,我们已开始迁移到 Honey SQL 2 作为新的中间目标。

我们计划继续支持使用 Honey SQL 1 直到 Metabase 0.49.0。请务必在此之前迁移您的驱动程序。

在 Metabase 0.46.x、0.47.x 和 0.48.x 中,您可以通过实现 `metabase.driver.sql.query-processor/honey-sql-version` 多方法来指定驱动程序应使用哪个版本的 Honey SQL。

(require '[metabase.driver.sql.query-processor :as sql.qp])

;;; use Honey SQL 2 for :my-driver
(defmethod sql.qp/honey-sql-version :my-driver
  [_driver]
  2)

此方法必须返回 `1` 或 `2`。目前,默认实现返回 `1`。实际上,这意味着您目前必须选择加入 Honey SQL 2 编译。最好尽早这样做,以便您的驱动程序为 0.49.0 做好准备。

在 Metabase 0.47.x 或 0.48.x 中,我们可能会将默认 Honey SQL 版本更改为 `2`,以确保每个人都意识到 0.49.0 中即将发生的重大更改,并给予他们一两个发行周期来更新其驱动程序以针对 Honey SQL 2。到 0.49.0 之前,您仍然可以通过实现 `sql.qp/honey-sql-version` 并返回 `1` 来选择加入使用 Honey SQL 1。

您需要更改的内容

我们的 Honey SQL 实用命名空间 `metabase.util.honeysql-extensions`(通常别名为 `hx`)已更新,以生成适合 Honey SQL 1 或 Honey SQL 2 的表单。这是根据驱动程序的 `honey-sql-version` 自动完成的。 `metabase.driver.sql.query-processor` 本身也以同样的方式支持两个目标。

您需要对驱动程序代码进行的实际更改可能相当小。移植驱动程序时要记住的最重要的事情是:

  1. 避免使用 Honey SQL 1 命名空间下的内容,例如 honeysql.corehoneysql.format。如果必须使用,请改用 Honey SQL 的 honey.sql;您可能两者都不需要。

  2. 虽然您可以在短期内继续使用 metabase.util.honeysql-extensions,因为它同时支持两个版本的 Honey SQL,但我们将来可能会移除这个命名空间。请更新您的代码,转而使用 metabase.util.honey-sql-2。这两个命名空间实现的辅助函数集几乎相同,因此您只需更改 ns 表单中 :require 的内容即可。

  3. honeysql.core/call 不再存在;不再需要像 (hsql/call :my_function 1 2) 这样的形式,您只需返回一个普通的向量,如 [:my_function 1 2](hsql/raw "x") 现在是 [:raw "x"]。可以使用 honey.sql/register-fn! 来向 Honey SQL 2 注册新的函数处理器。Honey SQL 1 的 honeysql.format./ToSql 协议没有等效的东西,因此您不应该再定义一次性类型来实现自定义 SQL 编译规则。请改用 honey.sql/register-fn!

  4. 在 Honey SQL 1 中,您可以通过实现多方法 honeysql.format/fn-handler 来在有限的程度上注册函数。Metabase 通过这种方式注册了 :extract:distinct-count:percentile-cont 函数。对于 Honey SQL 2,我们将这些函数注册为 metabase.util.honey-sql-2 命名空间中的限定关键字,以避免混淆它们的定义位置。因此,如果您使用这些函数,则需要更新关键字。

    ;;; Honey SQL 1
    (hsql/call :distinct-count expr)
    

    变为

    ;;; Honey SQL 2
    (require '[metabase.util.honey-sql-2 :as h2x])
    
    [::h2x/distinct-count expr]
    
  5. 由于自定义表达式现在只是普通的向量,例如 [:my_function 1],如果它们出现在 :select:from 或其他可能将向量解释为 [expression alias] 的地方,您可能需要将表达式包装在额外的向量中。例如:

    ;; Honey SQL 1
    (honeysql.core/format {:select [[:my_function 1]]})
    ;; => ["SELECT my_function AS 1"]
    
    ;; Honey SQL 2
    ;;
    ;; WRONG
    (honey.sql/format {:select [[:my_function 1]]})
    ;; => ["SELECT my_function AS ?" 1]
    
    ;; CORRECT
    (honey.sql/format {:select [[[:my_function 1]]]})
    ;; => ["SELECT MY_FUNCTION(?)" 1]
    

    SQL 查询处理器会自动为它生成的形式执行此操作,因此您只需在重写它生成 :select 或其他顶级子句的方式时才需要担心此问题。

  6. 数字默认会被参数化,例如 {:select [1]} 会变成 SELECT ? 而不是 SELECT 1。您可以使用 :inline 来强制 SQL 生成为内联形式:{:select [[[:inline 1]]]} 会变成 SELECT 1。SQL 查询处理器代码生成的数字应该会自动内联,但您可能需要确保您生成的任何数字都被包装在 :inline 中,如果它们可能作为表达式出现在 GROUP BY 子句中。某些数据库只有在数字 *未* 被参数化时才能识别它们是相同的内容。

    -- This is okay
    SELECT x + 1
    FROM table
    GROUP BY x + 1
    
    -- Bad: DB doesn't know whether the two x + ? expressions are the same thing
    SELECT x + ?
    FROM table
    GROUP BY x + ?
    

在使用 :inline 时要谨慎——注意不要在不受信任的字符串或其他可能导致 SQL 注入的途径上使用它。只内联 number? 的内容是比较安全的选择。

请阅读 Honey SQL 1.x 和 2.x 之间的区别,了解更多关于库版本之间差异的信息。

注意:我们预计这些重大更改将在 0.46.0 发布之前得到修复。如果修复,本文档将更新。

metabase.util.honeysql_extensions.Identifiermetabase.util.honeysql_extensions.TypedHoneySQLForm 已分别移动到 metabase.util.honey_sql_1.Identifiermetabase.util.honey_sql_1.TypedHoneySQLForm。万一您的驱动程序直接引用了这些类名,您可能需要更新以使用新的类名。

同样,metabase.util.honeysql-extensions/->AtTimeZone 已被移除;请改用 metabase.util.honeysql-extensions/at-time-zone

Metabase 0.45.0

  • metabase.driver.sql-jdbc.connection/details->connection-spec-for-testing-connection 已在 Metabase 0.45.0 中移除,因为它会泄露 SSH 隧道。请参阅 #24445。如果您正在使用此函数,请更新您的代码,转而使用 metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection,后者会正确地清理自身。

新方法

  • 已添加 metabase.driver.sql-jdbc.sync.describe-table-fields。如果您想覆盖获取表元数据(如类型)的默认行为,请实现此方法。

  • 已添加 metabase.driver.sql-jdbc.sync.describe-table/get-table-pks。此方法用于获取给定表的 pks 集合。

  • 已添加 ->honeysql [<driver> :convert-timezone]。如果您希望您的驱动程序支持 convertTimezone 表达式,请实现此方法。此方法接受 2 或 3 个参数,并返回一个 timestamp without time zone 列。

Metabase 0.43.0

  • MBQL 查询中的 :expressions map 现在使用字符串作为键,而不是关键字(请参阅 #14647)。只有当您直接访问或操作此 map 时才需要关注这一点。派生自 :sql 并为 [<driver> :expression] 实现 ->honeysql 的驱动程序可能需要更新。一个实用函数 metabase.mbql.util/expression-with-name,至少自 Metabase 0.35.0 起就可用,并且可以处理两种类型的键。强烈建议您使用此函数,而不是直接访问 :expressions,因为这样做可以使您的驱动程序同时兼容 0.42.0 和 0.43.0 及更高版本。

  • sql-jdbc.sync 命名空间下现在有一个 describe-nested-field-columns 方法,它返回一个 NestedFCMetadata 实例。这是为了允许 PostgreSQL 和其他数据库支持 JSON 列,这些数据库通常是普通的关系型数据库,但有时它们有一个带有 JSON 或其他语义的非规范化列。给定一个具有嵌套字段语义的非规范化列的表(即,类型化的子字段,这些子字段仍然是非规范化的,但在行之间类型稳定),返回值应该是一个 NestedFCMetadata,它是映射到检测到的子字段的展平键路径的 map。同步中的字段检测将通过这些嵌套类型进行丰富。这与我们处理 MongoDB 的方式有实质性区别,因为每种 JSON 列都不同,但它将在每次同步时运行,因此即使在巨大的表和这些巨大表上巨大的非规范化列上,它也不会太慢。

Metabase 0.42.0

Metabase 0.42.0 中的更改影响了派生自 :sql(包括 :sql-jdbc)的驱动程序。非 SQL 驱动程序可能不需要进行任何更改。

0.42.0 版本对 SQL 查询处理器编译和确定 MBQL :field 子句别名的方式进行了一些重大的更改。有关更多背景信息,请参阅 pull request #19384

如果您之前正在操作 Field 或 Table 的别名,我们合并了许多重叠的变量和方法,这意味着您可能需要删除已弃用的方法实现。

重大更改

  • Field 实例的 metabase.driver.sql.query-processor/->honeysql 方法,例如:

    (defmethod sql.qp/->honeysql [:my-driver (class Field)]
      [driver field]
      ...)
    

    不再被调用。所有编译现在都由 MBQL :field 子句方法处理,例如:

    (defmethod sql.qp/->honeysql [:my-driver :field]
      [driver field-clause]
      ...)
    

    如果您之前在这里进行了特殊处理,您需要将该特殊逻辑移至 [<driver> :field] 中。(不过,您可能不再需要此特殊逻辑了——见下文。)

  • :field:expression:aggregation-options 子句现在包含有关如何在 SQL AS 的左右两侧或查询的其他位置引用它们的别名的信息。有关新信息的详细讨论,请参阅 PR #19610,以下简称“/#19610 信息/”。

  • 如果您为 :field(class Field) 自定义实现了 ->honeysql:field->honeysql 方法应使用或替换 #19610 信息,而不是尝试以其他方式确定或覆盖它。

新方法

  • metabase.driver/escape-alias(从 metabase.driver.sql.query-processor/escape-alias 移动,后者在 0.41.0 中引入)现在用于生成 #19610 信息,并在 SQL QP 代码中一致使用。如果您需要出于任何原因转换生成的 Field 别名(例如,转义不允许的字符),请实现此方法。

  • 已添加 metabase.driver.sql-jdbc.sync.interface/filtered-syncable-schemas,它将最终取代 metabase.driver.sql-jdbc.sync.interface/syncable-schemas。它的用途类似,但它还会传递包含和排除模式(例如 auth*,data*)以进一步过滤要同步的模式。

已弃用的方法和变量

除非另有说明,否则以下方法和变量计划在 Metabase 0.45.0 中移除。

  • metabase.driver/format-custom-field-name 现在不再使用。请改用 metabase.driver/escape-alias

  • metabase.driver.sql.query-processor/escape-alias 已重命名为 metabase.driver/escape-alias。其他一切保持不变。

  • metabase.driver.sql.query-processor/field-clause->alias 不再使用可选参数 unique-name-fn。别名现在会自动使其唯一,在转义它们之后;如果您需要在它们变得唯一之前执行一些特殊操作,请实现 metabase.driver/escape-alias。(如果您需要做一些*真正*特殊的事情,唯一别名也会被再次转义。)

  • metabase.driver.sql.query-processor/field->alias(在 0.41.0 中被弃用)在 0.42.0 中不再使用。实现此方法不再有任何效果。如果您需要执行特殊操作,请改用 metabase.driver/escape-alias;如果您出于任何原因需要转义别名,请使用 #19610 信息。此方法仍计划在 Metabase 0.44.0 中移除。

  • metabase.driver.sql.query-processor/*field-options* 现在不再使用,也不会自动绑定。如果您因为某些原因需要字段选项,请参考我们的 SQL Server 驱动程序,了解如何创建它的示例。

  • metabase.driver.sql.query-processor/*table-alias* 现在不再使用,也不会自动绑定。请使用或覆盖 #19610 信息 中的 :metabase.query-processor.util.add-alias-info/source-table

  • metabase.driver.sql.query-processor/*source-query* 现在不再使用,也不会自动绑定。请使用 metabase.driver.sql.query-processor/*inner-query*,它始终绑定,即使我们不在源查询内部。

  • metabase.driver.sql.query-processor/field->identifier 现在不再使用。在任何情况下都不再需要实现此方法。请重写 ->honeysql[<driver> :field],并根据需要操作 #19610 信息

  • metabase.driver.sql.query-processor/prefix-field-alias 不再使用。以前,它可供驱动程序有机会转义连接的 Field 的自动生成的别名。这不再是必需的,因为 metabase.driver/escape-alias 会在自动生成的别名上被调用。如果您需要执行特殊操作,请实现 metabase.driver/escape-alias
  • metabase.driver.sql-jdbc.sync.interface/syncable-schemas 已弃用,转而使用 metabase.driver.sql-jdbc.sync.interface/filtered-syncable-schemas(见上文)。syncable-schemas 的现有默认实现当前调用 filtered-syncable-schemas(带有 nil 过滤器,即过滤操作实际上是无操作的),但它最终将被移除。

已移除的方法和变量

  • metabase.mbql.schema/DatetimeFieldUnit(在 0.39.0 中弃用)现已移除。

旧版本

在 0.42.0 之前,这些信息是在我们的 Wiki 上跟踪的。您可以在下表中找到 0.42.0 之前版本的更改。

版本 Wiki 页面
0.41.0 更改
0.40.0 无更改。
0.39.0 无更改。
0.38.0 更改
0.37.0 更改
0.36.0 更改
0.35.0 更改

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档?提议更改。
© . This site is unofficial and not affiliated with Metabase, Inc.