Python Simple Salesforce:在联系人中为导入的联系人自动填充 AccountID

如何解决Python Simple Salesforce:在联系人中为导入的联系人自动填充 AccountID

我正在使用简单的 Salesforce Python 库将 10 个联系人从外部数据源导入 Salesforce。

背景一个帐户可以有多个联系人记录。我在帐户和联系人中都创建了一个 ExternalAccountID 字段。与要导入的 10 个联系人相关的帐户已加载到帐户对象中。帐户对象中的“ExternalAccountID”包含“旧帐户 ID”(例如 1234_LegacyAccountId)。

帐户中的“ExternalAccountID”字段是“外部”且唯一。 Contact 中的“ExternalAccountID”不是唯一的,因为每个帐户可以有多个联系人。

Contact 中的“ExternalAccountContactID”是“External”和“Unique”。此字段由旧帐户 ID + 旧联系人 ID 的串联组成。此字段用于更新联系人数据。

问题: Account 对象的“Id”未自动填充到“Contact”对象的 AccountId 字段中,10 个联系人的帐户已在 Account 对象中可用。

当前的解决方案使用 Pandas Dataframe 来更新 10 个联系人。这是查询源数据并在 Salesforce 目标服务器中更新数据的代码片段。

    information = sf.query_all(query= sql_code)
    table = pandas.DataFrame(information['records']).drop(columns='attributes')
    table['ExternalAccountID'] = table.Id 
    table['ExternalAccountContactID']=(table['AccountId'].astype(str)) +"_"+ 
    (table['Id'].astype(str))
    new_df = table[['Name','Email','ExternalAccountID','Department']]
    new_df = new_df.rename(columns= 
    {"ExternalAccountID":"ExternalAccountID__c","Name":"Name","Email":"Email","Department":"Department"})  
    results_json = new_df.to_json(orient='records')
    records_upsert = json.loads(results_json)
    print ("Records to be upserted")
    sft.bulk.Contact.upsert(records_upsert,'ExternalAccountContactID__c',batch_size=10000,use_serial=True)

我应该在脚本中的何处指定需要引用相关 Account 对象以便可以检索 Account 中的“Id”?在 Data Loader 中,我能够更新数据,并且 Contact 中的“AccountId”正在自动填充,如何使用 Python 实现相同的结果?任何提示

解决方法

假设 Account 上的 ext id 是 1234_LegacyAccountId,Contact 上的 ext id 是 1234_LegacyAccountId_1_Contact。

您需要的原始 REST API 请求类似于

https://yourInstance.salesforce.com/services/data/v52.0/sobjects/Contact/ExternalAccountContactID__c/1234_LegacyAccountId_1_Contact

{
   "FirstName" : "Joe","LastName" : "Bloggs","Email" : "example@example.com","Account" :
   {
       "ExternalAccountID__c" : "1234_LegacyAccountId" 
   }
}

这里写了一点:https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_upsert.htm

现在你需要弄清楚如何用 simple/pandas 来表示它。也许首先命名列 Account:ExternalAccountID__c (或带点)。也许熊猫允许对象作为列有效负载?

最坏的情况是您可以自己调用 REST,只需从 simple 的登录方法中窃取获取服务器和会话 ID 并手动制作 REST 调用。见https://github.com/simple-salesforce/simple-salesforce#additional-features

这种形式的 upsert 一次只能处理 1 条记录(因为您在 url 中传递了联系人的 ext id,您不能将多个联系人作为有效负载发送)。一旦掌握了单个调用,您就可以在单个请求中将它们批量处理多达 25 个(根据我的记忆,可能已经增加了),有点像我的回答 https://salesforce.stackexchange.com/a/274696/799

还有 https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_graph_introduction.htm 但我认为 simple 不支持,看起来有点黑魔法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?