关于 sf-data
sf-data 是面向 Salesforce 数据操作的技能,涵盖查询、迁移与清理。它强调按对象关系安排加载顺序,并通过外部 ID、备份和结果核验降低操作风险。
主要功能
- 01查询并导出 CSV 或 JSON
- 02从文件导入与批量 Upsert
- 03按关联关系安排加载顺序
- 04批量删除及结果核验
- 05迁移 Salesforce 文件
适用场景
- 01将数据导出为 CSV 或 JSON
- 02使用外部 ID 跨组织 Upsert
- 03为 Sandbox 填充测试数据
- 04清理记录并核对批处理结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ clientell-ai/ salesforce-skills --skill sf-data安装后在 Claude Code 中输入/sf-data确认已加载。
附带文件references/data-patterns.md
详细介绍
数据迁移与管理
你是一名 Salesforce 数据专家。请安全、高效地处理数据操作。
数据操作
查询和导出
# Query records
sf data query -q "SELECT Id, Name, Industry FROM Account WHERE Industry != null LIMIT 100" --target-org myOrg
# Export to CSV
sf data query -q "SELECT Id, Name, Industry FROM Account" --target-org myOrg --result-format csv > accounts.csv
# Export to JSON
sf data query -q "SELECT Id, Name FROM Account" --target-org myOrg --result-format json > accounts.json
# Bulk query (large datasets)
sf data query -q "SELECT Id, Name FROM Account" --target-org myOrg --bulk
导入和 Upsert
# Insert records from CSV
sf data import tree -f data/accounts.json --target-org myOrg
# Bulk upsert
sf data upsert bulk -s Account -f accounts.csv -i External_Id__c --target-org myOrg
# Insert with plan (preserves relationships)
sf data import tree -p data/plan.json --target-org myOrg
相关记录的数据计划
[
{
"sobject": "Account",
"saveRefs": true,
"resolveRefs": false,
"files": ["Account.json"]
},
{
"sobject": "Contact",
"saveRefs": false,
"resolveRefs": true,
"files": ["Contact.json"]
}
]
沙盒数据播种脚本
#!/bin/bash
# seed-sandbox.sh — Create test data in a sandbox
ORG_ALIAS="${1:-sandbox}"
echo "Seeding data in $ORG_ALIAS..."
# Insert accounts
sf data import tree -f data/seed/accounts.json --target-org "$ORG_ALIAS"
# Insert contacts (references accounts)
sf data import tree -f data/seed/contacts.json --target-org "$ORG_ALIAS"
# Insert opportunities
sf data import tree -f data/seed/opportunities.json --target-org "$ORG_ALIAS"
echo "Seeding complete."
用于数据设置的匿名 Apex
# Run anonymous Apex for complex data setup
sf apex run -f scripts/seed-data.apex --target-org myOrg
// scripts/seed-data.apex
List<Account> accounts = new List<Account>();
for (Integer i = 0; i < 100; i++) {
accounts.add(new Account(
Name = 'Test Account ' + i,
Industry = 'Technology',
BillingState = 'CA'
));
}
insert accounts;
System.debug('Inserted ' + accounts.size() + ' accounts');
数据清理
# Delete records matching criteria
sf data delete bulk -s Account -f delete-ids.csv --target-org myOrg
# Delete all records of a type (careful!)
sf data query -q "SELECT Id FROM TempObject__c" --target-org myOrg --result-format csv > to-delete.csv
sf data delete bulk -s TempObject__c -f to-delete.csv --target-org myOrg
Bulk API 2.0
用于超过 2,000 条记录的数据集。速度显著快于标准 API。
# Bulk upsert from CSV
sf data upsert bulk -s Account -f accounts.csv -i External_Id__c --target-org myOrg
# Bulk delete from CSV (Id column required)
sf data delete bulk -s Account -f delete-ids.csv --target-org myOrg
# Check job status
sf data bulk results -i <jobId> --target-org myOrg
- 导入作业超时:10 分钟;查询作业超时:15 分钟
- 文件大小上限:每个 CSV 150 MB
- 每个滚动 24 小时窗口最多处理 1.5 亿条记录
External ID 最佳实践
- 选择在源组织和目标组织中都唯一的字段
- 将字段标记为 External ID 和 Unique,以确保 Upsert 操作的幂等性
- 不能将已屏蔽字段用作 External ID(Data Mask 的限制)
- 跨组织同步时:使用 UUID 或复合键(OrgId + RecordId)
关系数据加载顺序
- 独立对象(没有必需的查找关系)
- 父对象(先加载 Account,再加载 Contact)
- 插入子记录之前,主从关系的父记录必须存在
- 加载关联对象(多对多)时,两个父对象都必须已加载
- 自引用记录:分两步加载(先插入但不设置自引用,然后更新)
记录类型映射
- 导出记录类型的开发人员名称(而非 ID)——不同组织中的 ID 不同
- 加载前,验证目标组织中存在对应的选项列表值
- 使用以下命令进行映射:
sf data query -q "SELECT Id, DeveloperName FROM RecordType WHERE SObjectType='Account'"
文件迁移(ContentVersion)
ContentVersion cv = new ContentVersion();
cv.Title = 'My File';
cv.PathOnClient = 'myfile.pdf';
cv.VersionData = Blob.valueOf('file content'); // or Base64-decoded
insert cv;
- ContentDocumentLink 用于将文件关联到记录
- 文件大小上限:2 GB(Salesforce Files)
- 将附件(旧版)迁移到 ContentVersion
规则
- 执行数据操作前,始终确认目标组织
- 测试查询时使用
--dry-run或LIMIT子句 - 保持引用完整性——先加载父记录,再加载子记录
- 使用 External ID 执行 Upsert 操作,避免产生重复项
- 执行破坏性操作前备份数据
- 数据集超过 200 条记录时,使用 Bulk API
注意事项
- 插入子记录前,主从关系的父记录必须存在,否则会出现
ENTITY_IS_DELETED或REQUIRED_FIELD_MISSING - Salesforce Data Mask 中的 External ID 字段不能被屏蔽
- Bulk API 作业在 10–15 分钟后超时——请拆分大型数据集
- 多态查找关系(例如 Task.WhatId)需要在导出查询中使用
TYPEOF - ContentVersion 必须包含
PathOnClient和VersionData——二者缺一不可 - 自引用记录(例如 Account.ParentId)需要分两步加载
- 即使个别记录失败,Bulk API 2.0 也会返回作业成功——务必检查结果
- 如果字段值超出字段长度,Data Loader 会静默截断
参考
- 数据模式 — Bulk API 2.0、Composite API、树形导出、External ID、大数据量、Big Objects、文件上传、多币种、ETL、备份与恢复
工作流
- 验证目标组织连接
- 分析数据需求(对象、关系、数据量)
- 导出或生成源数据
- 按正确的对象顺序制定导入计划
- 使用合适的方法(tree、bulk、匿名 Apex)执行导入
- 导入后验证数据完整性
评论
支持 Markdown