【问题标题】:SalesforceR: Enable PKChunking for SalesForce Bulk Query in RSalesforceR:在 R 中为 SalesForce 批量查询启用 PKChunking
【发布时间】:2023-04-08 09:38:01
【问题描述】:

我正在尝试使用 SalesforceR 包从 Salesforce 到 R 查询一个大表(30M 记录),并希望这样做不会拆分成许多查询。

如果我限制记录,则以下查询(为安全/可读性更改名称)成功:

OrderItemsSF <- sf_query_bulk("SELECT Id,Order,Product,Quantity FROM OrderItems LIMIT 1000000",object_name = "OrderItems", api_type = "Bulk 1.0", verbose = TRUE, max_attempts = 1000)

只要花费超过 10 分钟,此查询就会失败(“错误:列名 'result' 不得重复”),这符合 SF 的文档,即批量查询在 10 分钟后重试(参见底部的链接 1)。我相信答案是让 PKChunking 能够自动将我的查询分成更小的批次,但是我很难找到一个有效的语法。

我尝试了以下方法:

OrderItemsSF <- sf_query_bulk("SELECT Id,Order,Product,Quantity FROM OrderItems LIMIT 1000000",object_name = "OrderItems", api_type = "Bulk 1.0", verbose = TRUE, max_attempts = 1000, control = sf_control(PKChunkingHeader = list(`Sforce-Enable-PKChunking`= TRUE)))

这会导致错误“catch_errors(httr_response) 中的错误: ClientInputError:Sforce-Enable-PkChunking 没有有效值。使用 FALSE 也会导致同样的错误,根据文档(见底部链接 2),FALSE 是该参数的默认值,所以这没有意义!

其他语法尝试,例如下面的尝试,在 10 分钟内成功查询并在 10 分钟内失败,这表明 R 忽略此文本而不是实际 PKChunking:

OrderItemsSF <- sf_query_bulk("SELECT Id,Order,Product,Quantity FROM OrderItems LIMIT 1000000",object_name = "OrderItems", api_type = "Bulk 1.0", verbose = TRUE, max_attempts = 1000, control = list(`Sforce-Enable-PKChunking`= TRUE))

我对看似简单的语法问题感到茫然,并且在 SalesforceR 查询中找不到任何在线 PKChunking 的具体示例,尽管文档说可以做到这一点。非常感谢这里的一些指导。

链接1:https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/asynch_api_bulk_query_processing.htm

链接2:https://cran.r-project.org/web/packages/salesforcer/salesforcer.pdf#Rfn.sf.Rul.control

【问题讨论】:

    标签: r salesforce chunking


    【解决方案1】:

    上面列出的错误是{salesforcer} v0.1.4 及以下版本中存在的错误。从 v0.2.0 开始,该问题已得到解决,您可以在启用 PKChunking 的情况下执行批量查询,如下所示:

    # install.packages('salesforcer')
    library(salesforcer)
    
    # authenticate using username, password, and security token ...
    sf_auth(username = "test@gmail.com", 
            password = "{PASSWORD_HERE}",
            security_token = "{SECURITY_TOKEN_HERE}")
    
    # ... or using OAuth 2.0 authentication
    sf_auth()
    
    # execute the query
    contacts <- sf_query("SELECT Id, Name FROM Contact Limit 10000", 
                         object_name = "Contact", 
                         api_type = "Bulk 1.0",
                         PKChunkingHeader = list(`Sforce-Enable-PKChunking` = TRUE),
                         # alternatively you can turn on using specific chunking options like this ...
                         # PKChunkingHeader = list(`chunkSize` = 500),
                         interval_seconds = 10,
                         max_attempts = 200)
    contacts
    #> # A tibble: 383 x 2
    #>    Id                 Name                           
    #>    <chr>              <chr>                                     
    #> 1 0033s000012NdFhAAK John Doe
    #> 2 0033s000012NkzwAAC Jane Doe
    #> 3 0033s000012NkzxAAC Jane Doe
    #> 4 0033s000012NkzyAAC Jane Doe
    #> 5 0033s000012NkzzAAC Jane Doe
    #> # … with 378 more rows
    

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多