使用Data Loader Command Line Interface定时同步数据到Salesforce(step by step with sample)

本文已参与「新人创作礼」活动,一起开启掘金创作之路

前言

在做某项目时,客户说他上一个Vender实施的定时同步数据这段时间出故障了,在没有足够业务背景情况下,我调查了相关数据集成的代码,并没发现sf上有任何数据集成或者定时任务,几经周折后,客户发了第一波实施文档,发现它们是由Data Loader在做定时同步数据。那么疑惑来了,这个Data Loader是我们平时用到的Data Loader吗?并没有发现它有定时同步数据的功能呀。直到准备Admin201考试时,无意中发现了Data Loader Command Line。

当第一次攻克这个难题后,就开始计划写这篇文章,直到1个季度过去了,这类问题又重新被抛到了我这,又花了不少时间研究,这次我想把这块好好说说,以备不时之需。

谈到这块,没做过的朋友可能想问这个技术能做什么?实施这个的流程有哪几步?成功的关键又有哪些?下面我们一一来盘点。

技术边界

能定时从Windows(仅适用于该系统)电脑指定文件夹加载数据,并同步到Salesforce。
举个例子:如果你们的业务需要每天定时同步数据到sf,而且这个量的峰值不是很好估计,涉及的对象又有很多,使用集成很可能触发限制,这个时候你可能需要考虑使用这项技术,把文件放在指定目录,定时触发command line发送指定借助Data Loader进行数据操作。

实施流程

quick start

  1. 下载Data Loader;
  2. 使用命令行创建加密key文件;
  3. 创建加密密码;
  4. 字段映射;
  5. 创建配置文件;
  6. 执行导入数据操作;

释义:我们会在一个xml的配置文件中模拟我们在Data Loader用户界面的一些配置项,比如我们需要将Data Loader连接到数据导入的目标环境,就涉及登录信息,然后我们需要选择数据操作类型insert/update/delete等,再比如我们需要确定操作对象,并指定CSV文件源,以及日志信息的存储路径等。

实例演示

  1. 我们需要对Servicing Consultant对象进行upsert操作,表结构如下:


本次案例,我们需要使用到的字段有:Primary_Consultant__c(Lookup Contact),Account__c(Lookup Account),Is_Primary_Consultant__c,Import_ID__c(外键);

  1. Data Sample:csv文件示例

  1. 字段映射,我们可以使用Data Loader来保存字段映射的Mapping文件,核心步骤如下:

a. 选择Upsert,使用关系字段外键来做映射(如我们不会直接使用ContactId和AccountId来作为导入关系字段的值,因为外部系统没有这些,这些值只有选择Upsert才能选中)
b. 按如下做好映射,并保存Mapping文件到指定目录:

c. 保存后的mapping文件preview:

Note: 如果你选择Insert操作,当你在做mapping时,选不到关系字段外键,如下:

  1. 加密登录密码,我们不会直接暴露登录密码到xml的配置文件,我们会按照如下命令行操作获取加密文件:

a. 找到Data Loader文件bin的路径:
右键打开文件位置如下:

右键属性并代开文件所在位置,并复制bin的路径。
b. 打开命令行窗口切换到bin目录路径,切换后依次输入下面指令:
encrypt.bat —k:用于生成加密key文件;
encrypt.bat –e :用于获取登录密码的加密文本;

  1. 保存好你的key file路径和上图标记c的加密密码文本,接下来我们来设置配置文件:process-conf.xml - 可参考官方文档
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="servicingConsultantUpsert"
        class="com.salesforce.dataloader.process.ProcessRunner"
        singleton="false">
        <description>servicingConsultantUpsert job gets the account record from the CSV file
            and upserts it into Salesforce.</description>
        <property name="name" value="servicingConsultantUpsert"/>
        <property name="configOverrideMap">
            <map>
                <!-- login info -->
                <entry key="sfdc.endpoint" value="https://test.salesforce.com"/>
                <entry key="sfdc.username" value="your username"/>
                <entry key="process.encryptionKeyFile"
                    value="C:\Users\sales.dataloader\dataLoader.key"/>
                <!--Password below has been encrypted using key file,
                    therefore, it will not work without the key setting:
                    process.encryptionKeyFile.
                    The password is not a valid encrypted value,
                    please generate the real value using the encrypt.bat utility -->
                <entry key="sfdc.password" value="your encoded password"/>

                <!-- data access and fields mapping info -->
                <entry key="sfdc.entity" value="Servicing_Consultant__c"/>
                <entry key="sfdc.externalIdField" value="Import_ID__c"/>
                <entry key="dataAccess.type" value="csvRead"/>
                <entry key="dataAccess.name"
                    value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\servicingConsultantUpsert.csv"/>
                <!-- You can refer to the documention to configuration the operation:
                     https://developer.salesforce.com/docs/atlas.en-us.dataLoader.meta/dataLoader/loader_operations.htm -->
                <entry key="process.operation" value="upsert"/>
                <entry key="process.mappingFile"
                    value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\servicingconsultantUpsertMap.sdl"/>

                <!-- other info -->
                <entry key="process.initialLastRunDate"
                    value="2019-03-15T22:00:00.000-0800"/>
                <entry key="sfdc.timeoutSecs" value="600"/>
                <entry key="sfdc.loadBatchSize" value="200"/>
                <entry key="sfdc.useBulkApi" value="true"/>

                <!-- debug and log storage -->
                <entry key="sfdc.debugMessages" value="true"/>
                <entry key="sfdc.debugMessagesFile"
                    value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsertSoapTrace.log"/>
                <entry key="process.outputSuccess"
                    value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsert_success.csv"/>
                <entry key="process.outputError"
                    value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsert_error.csv"/>
            </map>
        </property>
    </bean>
</beans>
复制代码

你也可以参考这篇文章,来了解每个参数的含义及允许的值: Data Loader 进程配置参数

  1. 执行命令行导入数据:此处易出错

process.bat "<process-conf.xml文件所在的路径>" <进程名称 - 使用你的process-conf.xml文件中的name属性的值>

执行完上述命令你的文件夹下会多出如下标注的文件和log文件夹的日志信息:

常见错误

如果你按上述操作可规避如下问题:

如果上述问题被正确规避,其他问题请参考log文件的error提示,一般要么是OLS/FLS/RLS等权限问题,要么是你参考的数据没找着,如下:

上面我提到过我需要插入的servicing consultant数据需要参考contact和account,如果data sample中的数据在sf系统没有,当然会出错呀,所以这个测试我需要先创建外键为data sample的contact和account数据后,再跑一遍命令行。

其他问题

SCHEDULE DATA LOADER IN SALESFORCE
Q1、如何使用windows定时任务来执行数据导入命令行?
A1、实施笔记:

1. 实时运行单个process
前提:切换到data loader bin目录下
win搜索cmd,右键以管理员身份运行
c: // 以防在其他根目录下
cd C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin

方法一:
使用相对路径处理单条数据
process ../demo/conf upsertAccounts

方法二:process.bat "C:\Users\sales\AppData\Local\salesforce.com\Data Loader\demo\conf" upsertAccounts

2. 实时自动执行多个processes:
创建batchxxx.bat文件
文件写入cmd执行语句,如下:
cd C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin
CALL process ../demo/conf upsertAccounts
CALL process ../demo/conf upsertContacts
pause

3. 定时自动执行多个processes
利用windows的task scheduler,可以创建高级task来确保在电脑关机情况下运行。

4. 其他:
AF_ScriptCode.clearSampleData(); // 清楚appForce的sample data

C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin // bin路径

C:\Users\sales.dataloader\dataLoader.key // key file path

db9569ab6b0b4cf777f082179056d14ccfec0dbe0253245e28f3eabb6ddf6abd // encrypted password -> test2020

命令行:
encrypt.bat -k
encrypt.bat -e test2020 C:\Users\sales.dataloader\dataLoader.key

process.bat "C:\Users\sales\AppData\Local\salesforce.com\Data Loader\demo\conf" upsertAccounts
复制代码

Q2、导入时中文字符乱码如何解决?
A2、设置dataAccess.readUTF8

Q3、执行process时,报错:Caused by: com.salesforce.dataloader.exception.ConfigInitializationException: Error initializing encryption for key file C:Userssales.dataloaderdataLoader.key: Failed to open file: C:Userssales.dataloaderdataLoader.key
A3、有两种方法解决:
方法1:将process.encryptionKeyFile=C:\Users{user}.dataloader\dataLoader.key信息从config.properties配置进process-conf.xml
方法2:在config.properties中配置如下:

# process.encryptionKeyFile=C:\Users\sales\AppData\Local\salesforce.com\Data Loader\project\savills\dataLoader.key
# the path need to be converted
process.encryptionKeyFile=C:\Users\sales\AppData\Local\salesforce.com\Data Loader\project\savills\dataLoader.key
复制代码

Q4、执行process时,报错:Caused by: java.lang.IllegalArgumentException: No enum constant com.salesforce.dataloader.action.OperationInfo.hard delete
A4、配置operation如下:

<!-- <entry key="process.operation" value="hard delete"/> -->
<entry key="process.operation" value="hard_delete"/>
复制代码

注意:记得分配'Bulk API Hard Delete' permission set给系统管理员!

Q5、导出SF数据写SOQL需要注意哪些?
A5、对于字符串无需使用转义字符,如下:

<entry key="sfdc.extractionSOQL" value="SELECT Id, External_ID__c FROM Tower__c WHERE Archived__c = '1' OR Select_Property__r.Archived__c = '1'"/>
复制代码

启发

可以将该技术应用到Raptor项目,来满足日常生产trail环境时sample数据迁移,该技术可将繁琐的数据导入工作(原1人天)缩短到5min。

  1. 如何定时自动备份SF数据到本地?
  2. 关于增量备份话题

参考文献

Data Loader Command Line Introduction
Data Loader Command-Line Interface
Run Individual Batch Processes
Encrypt from the Command Line

日常数据备份:Data loader 对某个对象定时备份

猜你喜欢

转载自juejin.im/post/7095658088711061535