使用 dlt 将数据加载到 Microsoft Fabric Warehouse:完整配置指南与源码解析
【免费下载链接】dltdata load tool (dlt) is an open source Python library that makes data loading easy 🛠️项目地址: https://gitcode.com/GitHub_Trending/dl/dlt
dlt(data load tool)为 Microsoft Fabric Warehouse 提供了开箱即用的目标(destination)支持。本文以官方文档 fabric.md 为核心骨架,结合仓库中dlt/destinations/impl/fabric/的源码实现与测试用例,系统讲解从安装、Service Principal 认证、staging 配置、类型映射到故障排查的完整实战流程。读完本文,你将能够基于 Service Principal 认证把 dlt 管道稳定地加载到 Fabric Warehouse,并理解其底层 COPY INTO、varchar/datetime2 类型转换与 UTF-8 排序规则的设计原理。
1. 概览:Fabric Warehouse 目标(destination)
Microsoft Fabric Warehouse 是微软 OneLake 体系下的数据仓库服务,底层技术基于 SQL Server / Synapse。dlt的 Fabric 目标通过在dlt/destinations/impl/fabric/目录下的专属实现(factory.py、fabric.py、sql_client.py、configuration.py)扩展 Synapse 能力,专门适配 Fabric 的差异化特性:
- 使用
fabricSQLglot 方言生成正确的 SQL; - 用
varchar替代nvarchar(Fabric 不支持 nvarchar); - 用
datetime2替代datetimeoffset(Fabric 不支持 datetimeoffset); - 支持通过 OneLake / Azure Blob 存储的
COPY INTO高效批量加载; - 针对 UTF-8 排序规则自动配置
LongAsMax=yes。
2. 安装与依赖
2.1 安装 dlt 的 Fabric 扩展
在官方文档中,安装命令如下:
pip install "dlt[fabric]"该命令会安装dlt以及mssql扩展(extra)中与 SQL Server 客户端相关的全部依赖——Fabric Warehouse 通过 SQL Server 兼容的 pyodbc 协议连接。从 configuration.py 可以看到,FabricCredentials的drivername默认即为"mssql+pyodbc"。
2.2 系统级前置条件:ODBC Driver
Microsoft ODBC Driver for SQL Server无法随dlt的 Python 依赖一同安装,必须单独在运行环境安装。官方文档支持以下版本:
ODBC Driver 18 for SQL Server(推荐)ODBC Driver 17 for SQL Server
你可以通过配置项显式指定驱动名称(见 第 10.2 节)。例如在 Ubuntu/Debian 上安装:
# Ubuntu/Debian curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18提示:ODBC 驱动的实际校验发生在建立连接阶段,而非配置解析阶段。测试用例 test_fabric_configuration.py 明确验证了这一点:即使未安装驱动,配置也能正常构造成功。
3. Service Principal 认证
3.1 认证要求
Fabric Warehouse必须使用 Azure Active Directory(Azure AD)Service Principal 认证,不支持用户名/密码方式。你需要准备以下信息:
- Tenant ID:你的 Azure AD 租户 ID(GUID)
- Client ID:应用程序(服务主体)客户端 ID(GUID)
- Client Secret:应用程序客户端密钥
- Host:Fabric Warehouse 的 SQL 端点
- Database:Warehouse 中的数据库名
如何找到 SQL 端点:
- 在 Fabric 门户中打开你的 Warehouse设置(Settings)
- 选择SQL endpoint
- 复制SQL 连接字符串,其格式为:
<guid>.datawarehouse.fabric.microsoft.com
3.2 凭据结构源码解析
FabricCredentials继承自AzureServicePrincipalCredentials(见 configuration.py),因此天然具备 Service Principal 字段与自动回退到DefaultAzureCredential的能力。核心字段包括:
| 字段 | 默认值 | 说明 |
|---|---|---|
drivername | mssql+pyodbc | SQLAlchemy 驱动名 |
host | 无 | Fabric Warehouse 主机,如<guid>.datawarehouse.fabric.microsoft.com |
port | 1433 | 数据库端口 |
database | 无 | Fabric Warehouse 数据库名 |
connect_timeout | 15 | 连接超时(秒) |
在 on_partial 中实现了一个重要的回退逻辑:如果显式的azure_client_id/azure_client_secret/azure_tenant_id三者缺失,则会尝试使用DefaultAzureCredential()作为默认凭据;只要host与database已提供,就会继续解析。这意味着在本地开发环境或已登录 Azure CLI 的环境中,即便不填写 Service Principal 密钥,也可能完成认证。
3.3 生成 ODBC DSN
get_odbc_dsn_dict 负责构建连接参数,关键项包括:
AUTHENTICATION=ActiveDirectoryServicePrincipal(服务主体认证方式)LongAsMax=yes(UTF-8 排序规则所必需,始终开启)Encrypt=yes、TrustServerCertificate=no(强制加密连接)- 当提供 Service Principal 三元组时,
UID自动组合为client_id@tenant_id,PWD为 client secret
测试用例 test_fabric_configuration.py 对上述 DSN 参数逐项断言,可作为自检清单。
4. 创建管道:从初始化到首次加载
官方文档给出了三步创建管道的流程:
第 1 步:初始化项目
dlt init chess fabric该命令生成一个以chess为示例数据源、目标为fabric的管道项目骨架。
第 2 步:安装依赖
pip install -r requirements.txt或直接安装:
pip install "dlt[fabric]"第 3 步:在.dlt/secrets.toml中填写凭据
[destination.fabric.credentials] host = "<your-warehouse-guid>.datawarehouse.fabric.microsoft.com" database = "mydb" azure_tenant_id = "your-azure-tenant-id" azure_client_id = "your-client-id" azure_client_secret = "your-client-secret" port = 1433 connect_timeout = 30也可以直接在代码中通过dlt.destinations.fabric(...)构造(见 第 9.2 节)。
5. Write Disposition(写入策略)
Fabric 目标支持全部写入策略,包括upsert与insert-only两种 merge 策略。
当你在replace策略中使用staging-optimized时,目标表会被drop 后通过ALTER SCHEMA ... TRANSFER重新创建。该操作是原子的:Fabric 支持 DDL 事务。
6. Staging 支持:OneLake 与 Azure Blob
6.1 为什么需要 staging
Fabric 的加载路径分两种(源码 fabric.py 中create_load_job的实现可以印证):
- 直接加载:默认通过 INSERT 语句写入,仅支持
insert_values格式(受限于单条 INSERT 最多 1000 行); - Staging 加载:对于 parquet 等大批量文件,Fabric 必须配置 staging(OneLake Lakehouse 或 Azure Blob / Data Lake Storage),通过
COPY INTO命令批量加载。这也是官方文档推荐的大数据集方案。
从源码看,非 staging 场景下若遇到 parquet 文件会直接抛出错误并提示"Configure staging with filesystem destination"——这解释了为什么大表加载一定要配置 staging。
6.2 管道中配置 staging
import dlt pipeline = dlt.pipeline( destination="fabric", staging="filesystem", dataset_name='my_dataset' )6.3 使用 OneLake 作为 staging
.dlt/secrets.toml:
[destination.fabric.credentials] # your fabric credentials [destination.filesystem] bucket_url = "abfss://<your-workspace-guid>@onelake.dfs.fabric.microsoft.com/<your-lakehouse-guid>/Files" [destination.filesystem.credentials] azure_storage_account_name = "onelake" azure_account_host = "onelake.blob.fabric.microsoft.com" # use same Service Principal credentials as in [destination.fabric.credentials] azure_tenant_id = "your-tenant-id" azure_client_id = "your-client-id" azure_client_secret = "your-client-secret"查找 GUID 的方法:
- 在浏览器中打开你的 Fabric workspace
- workspace GUID 位于 URL 中:
https://fabric.microsoft.com/groups/<workspace_guid>/... - 打开你的 Lakehouse
- lakehouse GUID 位于 URL 中:
https://fabric.microsoft.com/.../lakehouses/<lakehouse_guid>
重要:
bucket_url必须使用 workspace 和 lakehouse 的GUID 而非显示名称(configuration.py 的 docstring 明确强调)。
6.4 使用 Azure Blob / Data Lake Storage 作为 staging
.dlt/secrets.toml:
[destination.fabric.credentials] # your fabric credentials [destination.filesystem] bucket_url = "az://your-container-name" [destination.filesystem.credentials] azure_storage_account_name = "your-storage-account-name" azure_storage_account_key = "your-storage-account-key"6.5 COPY INTO 的底层实现
FabricCopyFileLoadJob(fabric.py)是 COPY INTO 的核心实现:
- 根据文件扩展名判断文件类型,仅支持
PARQUET,其他类型直接报错; - 对于 OneLake(
abfss://+onelake.dfs.fabric.microsoft.com主机)路径,会将abfss路径转换为https://onelake.dfs.fabric.microsoft.com/<workspace>/<path>形式供 COPY INTO 使用; - 对于普通 Azure Storage,则使用 SAS token 凭证(
IDENTITY = 'Shared Access Signature'); - OneLake + Service Principal 场景下,会先通过
_ensure_fabric_token_initialized(fabric.py)调用 Fabric API 初始化令牌——这一初始化结果按client_id缓存在类级字典中,避免批量加载多个文件时因频繁调用 API 触发限流。
7. 数据加载与文件格式
7.1 加载方式
默认通过INSERT 语句加载数据。Fabric Warehouse 单条 INSERT 有 1000 行上限,dlt即按此上限执行。
7.2 支持的格式
insert-values是默认且当前唯一支持的直接加载格式。
从 factory.py 的能力声明看,该格式策略继承自 Synapse:直接加载使用insert_values,staging 使用 parquet。
8. 列提示(Column Hints)与标识符
8.1 索引创建默认关闭
fabric目标会为带unique提示的列创建唯一索引,但该行为默认关闭。源码依据在 fabric.py:当create_indexes=False(默认)时,primary_key与unique提示会从active_hints中被移除。测试 test_fabric_table_builder.py 也验证了默认情况下 SQL 中不会出现PRIMARY KEY与UNIQUE约束。
启用方式(见 第 10.1 节)。
8.2 大小写不敏感的标识符
Fabric Warehouse(与 SQL Server 一致)使用大小写不敏感标识符,但会保留存储在 INFORMATION SCHEMA 中的标识符大小写。你可以使用大小写敏感命名约定来保持标识符大小写。
注意:这存在产生标识符冲突的风险,
dlt会检测到冲突并使加载过程失败。
从 factory.py 的adjust_capabilities可以看到:当has_case_sensitive_identifiers为 True 时,会设置casefold_identifier = str(即不做大小写折叠),以配合大小写敏感的排序规则。
9. 类型映射与排序规则(Data Types & Collation)
Fabric Warehouse 与标准 SQL Server 在类型系统上有几处关键差异,全部体现在FabricTypeMapper(factory.py)中。
9.1 VARCHAR vs NVARCHAR
Fabric Warehouse 使用varchar而非nvarchar存储文本列。由于varchar长度按字节计算,而precision按字符计算,因此precision需乘以 4(UTF-8 单字符最多 4 字节):
text→varchar(max)- 带
precision的text→varchar(precision * 4),例如precision=25→varchar(100) precision超过 2000 的text→varchar(max),因为 8000 是 Fabric 接受的最长显式长度
测试用例 test_fabric_type_mapper_scales_varchar_precision 精确验证了这条换算链:precision=100 → varchar(400)、precision=2000 → varchar(8000)、precision=2001 → varchar(max)。
9.2 DATETIME2 vs DATETIMEOFFSET
Fabric 使用datetime2存储时间戳,而非datetimeoffset:
timestamp→datetime2(6)(精度限制为 0-6,而非 0-7)time→time(6)(必须显式指定精度)
从源码看,to_db_datetime_type会把超出范围的精度钳制到 0-6,默认使用datetime2(6);FabricTypeMapper还会兜底地把任何datetimeoffset替换为datetime2。同时能力声明中max_timestamp_precision = 6、supports_tz_aware_datetime = False(factory.py),意味着时区信息在写入时会被丢弃——这是 Fabric 的固有限制。
9.3 JSON 存储
Fabric 不支持原生 JSON 列,JSON 对象统一存储为varchar(max)列。
9.4 排序规则(Collation)
Fabric Warehouse 支持 UTF-8 排序规则。目标会自动配置LongAsMax=yes,这是 UTF-8 排序规则正常工作的前提。
默认排序规则:Latin1_General_100_BIN2_UTF8(区分大小写、UTF-8)
你可以在配置中指定其他排序规则(TOML 方式):
[destination.fabric] collation = "Latin1_General_100_CI_AS_KS_WS_SC_UTF8" # case-insensitive或者在代码中指定:
pipeline = dlt.pipeline( destination=dlt.destinations.fabric( credentials={}, collation="Latin1_General_100_CI_AS_KS_WS_SC_UTF8" ) )排序规则会影响标识符大小写敏感性:默认的
BIN2(二进制)排序规则区分大小写,而CI(case-insensitive)不区分。配置层的collation默认值与能力层的has_case_sensitive_identifiers相互配合(见 configuration.py)。
10. 其他目标选项
10.1 启用唯一索引创建
fabric目标默认不会为带unique提示(如_dlt_id)的列创建唯一索引。要启用该行为:
[destination.fabric] create_indexes=true启用后,建表 SQL 中会生成UNIQUE NOT ENFORCED/PRIMARY KEY NONCLUSTERED NOT ENFORCED约束(Fabric 的约束是不强制执行的)。测试 test_fabric_table_builder.py 完整覆盖了默认关闭与显式启用两种路径。
10.2 显式指定 ODBC 驱动名称
[destination.fabric.credentials] driver="ODBC Driver 18 for SQL Server"11. 与 MSSQL 目标的主要差异
尽管 Fabric Warehouse 基于 SQL Server,两者存在关键差异:
- 认证方式:Fabric 必须使用 Service Principal;不支持用户名/密码认证
- 类型系统:使用
varchar与datetime2,而非nvarchar与datetimeoffset - 排序规则:针对 UTF-8 排序规则优化,自动配置
LongAsMax - SQL 方言:使用
fabricSQLglot 方言生成 SQL
此外还有一些实现层面的差异值得一提:Fabric 不支持表索引,存储由系统自动管理,因此建表 SQL 中不会出现WITH (HEAP)或WITH (CLUSTERED COLUMNSTORE INDEX)子句(fabric.py),_get_column_def_sql也绕过了 mssql 对唯一文本列的 900 字节上限(fabric.py),因为 Fabric 没有索引键限制。
11.1 dbt 支持
与 dbt 的集成通过dbt-fabric提供支持。Service Principal 与默认 Azure 凭据两种方式都受支持,并与 dbt runner 共享。
12. 状态同步
该目标完整支持 dlt state sync,即管道状态(incremental 游标、资源状态等)可以随数据一同同步到 Fabric Warehouse,保证增量加载的连续性。
13. 故障排查
13.1 ODBC 驱动未找到
若出现"No supported ODBC driver found",请安装 Microsoft ODBC Driver 18 for SQL Server(安装命令见 第 2.2 节)。
13.2 认证失败
请确认你的 Service Principal:
- 在 Fabric workspace 上具有适当权限
- 有权访问目标数据库 / Warehouse
- Tenant ID 正确(应该是你的 Azure AD 租户 ID,而非 workspace / capacity ID)
13.3 UTF-8 字符问题
如果遇到字符编码问题:
- 确认你的 Warehouse 使用 UTF-8 排序规则
- 检查连接中是否带有
LongAsMax=yes(该目标会自动添加) - 如有需要,可改用不区分大小写的 UTF-8 排序规则
14. 相关资源
- Microsoft Fabric Documentation
- Fabric Warehouse Documentation
- Service Principal Setup Guide
- 源码:Fabric 目标实现位于 dlt/destinations/impl/fabric/,测试用例位于 tests/load/fabric/,可深入阅读以验证本文所有结论
【免费下载链接】dltdata load tool (dlt) is an open source Python library that makes data loading easy 🛠️项目地址: https://gitcode.com/GitHub_Trending/dl/dlt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考