Low commit activity in last 3 years
There's a lot of open issues
A long-lived project that still receives updates
Salesforce Bulk API with governor limits taken care of
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0
>= 12.3.3
~> 3.0.0
>= 0

Runtime

 Project Readme

Salesforce-Bulk-Api

Gem Version

Overview

SalesforceBulkApi is a Ruby wrapper for the Salesforce Bulk API. It is rewritten from salesforce_bulk and adds some missing features.

Installation

Add this line to your application's Gemfile:

gem 'salesforce_bulk_api'

Or install it yourself as:

gem install salesforce_bulk_api

Authentication

You can authenticate with Salesforce using two gems: databasedotcom or restforce. Please check the documentation of the respective gems to learn how to authenticate with Salesforce:

You can use username/password combo, OmniAuth, or OAuth2.

Authentication Examples

Using Databasedotcom:

require 'salesforce_bulk_api'

client = Databasedotcom::Client.new(
  client_id: SFDC_APP_CONFIG["client_id"],
  client_secret: SFDC_APP_CONFIG["client_secret"]
)
client.authenticate(
  token: " ",
  instance_url: "http://na1.salesforce.com"
)

salesforce = SalesforceBulkApi::Api.new(client)

Using Restforce:

require 'salesforce_bulk_api'

client = Restforce.new(
  username: SFDC_APP_CONFIG['SFDC_USERNAME'],
  password: SFDC_APP_CONFIG['SFDC_PASSWORD'],
  security_token: SFDC_APP_CONFIG['SFDC_SECURITY_TOKEN'],
  client_id: SFDC_APP_CONFIG['SFDC_CLIENT_ID'],
  client_secret: SFDC_APP_CONFIG['SFDC_CLIENT_SECRET'],
  host: SFDC_APP_CONFIG['SFDC_HOST']
)
client.authenticate!

salesforce = SalesforceBulkApi::Api.new(client)

Usage

Basic Operations

# Insert/Create
new_account = { "name" => "Test Account", "type" => "Other" }
records_to_insert = [new_account]
result = salesforce.create("Account", records_to_insert)
puts "Result: #{result.inspect}"

# Update
updated_account = { "name" => "Test Account -- Updated", "id" => "a00A0001009zA2m" }
records_to_update = [updated_account]
salesforce.update("Account", records_to_update)

# Upsert
upserted_account = { "name" => "Test Account -- Upserted", "External_Field_Name" => "123456" }
records_to_upsert = [upserted_account]
salesforce.upsert("Account", records_to_upsert, "External_Field_Name")

# Delete
deleted_account = { "id" => "a00A0001009zA2m" }
records_to_delete = [deleted_account]
salesforce.delete("Account", records_to_delete)

# Query
res = salesforce.query("Account", "SELECT id, name, createddate FROM Account LIMIT 3")

Helpful Methods

# Check status of a job
job = salesforce.job_from_id('a00A0001009zA2m')
puts "Status: #{job.check_job_status.inspect}"

Event Listening

# Listen for job creation
salesforce.on_job_created do |job|
  puts "Job #{job.job_id} created!"
end

Fetching Records from a Batch

job_id = 'l02A0231009Za8m'
batch_id = 'H24a0708089zA2J'
records = salesforce.get_batch_records(job_id, batch_id)

Throttling API Calls

# Set status check interval to 30 seconds
salesforce.connection.set_status_throttle(30)

Contributing

Feel free to fork and send Pull Requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.