SQL 方言

DialectDbApiHook 实现和数据库之间提供了一个抽象层。对于某些数据库,有多种连接类型可用,例如原生、ODBC 或 JDBC。由于 OdbcHookJdbcHook 是通用 Hook,允许您与任何具有相应驱动程序的数据库进行交互,因此需要一个抽象层,使得我们可以根据连接的数据库运行专门的查询,这就是引入方言的原因。

默认的 Dialect 类提供了以下操作,它们底层使用 SQLAlchemy 来执行,但可以针对每个数据库通过专门的实现进行重载

  • placeholder 指定了预处理语句中使用的特定于数据库的占位符(默认为:%s);

  • inspector 返回 SQLAlchemy 的 Inspector,允许我们检索数据库元数据;

  • extract_schema_from_table 允许我们从字符串中提取模式名称。

  • get_column_names 使用 SQLAlchemy Inspector 返回给定表和模式(可选)的列名。

  • get_primary_keys 使用 SQLAlchemy Inspector 返回给定表和模式(可选)的主键。

  • get_target_fields 返回不是标识列或自增列的列名,如果在调用 DbApiHookinsert_rows 方法时未指定 target_fields 参数,并且 Airflow 属性 core.dbapihook_resolve_target_fields 设置为 True(默认为 False),则会使用此方法。

  • reserved_words 使用 SQLAlchemy Inspector 返回目标数据库在 SQL 中的保留字。

  • generate_insert_sql 为目标数据库生成 INSERT SQL 语句。

  • generate_replace_sql 为目标数据库生成 UPSERT SQL 语句。

目前只有 3 种方言可用

  • default Dialect 重用了 DbApiHook 中已有的通用功能;

  • mssql MsSqlDialect 专门用于 Microsoft SQL Server;

  • postgresql PostgresDialect 专门用于 PostgreSQL;

要使用的方言将从连接字符串中派生,但这有时不可行。始终可以通过连接的 Extra 选项来指定方言名称

dialect_name: 'mssql'

如果某个数据库没有可用的特定方言,或者指定了一个不存在的方言名称,则将使用默认方言。

此条目有帮助吗?