!pip install simple_salesforce
!pip install salesforce_bulk
import json
import datetime as dt
import pandas as pd
import numpy as np
import time as t
from simple_salesforce import Salesforce,SalesforceLogin,SFType
from salesforce_bulk import SalesforceBulk
from salesforce_bulk.util import IteratorBytesIO
from urllib.parse import urlparse
from salesforce_bulk import CsvDictsAdapter
!pip show simple_salesforce
!pip show salesforce_bulk
import Salesforce_one
import Salesforce_two
username = Salesforce_one.username
password = Salesforce_one.password
security_token = Salesforce_one.security_token
domain = 'login'
session_id, sf_instance = SalesforceLogin(username=username, password=password, security_token=security_token,domain=domain)
sf = Salesforce(instance=sf_instance,session_id=session_id)
print(username,sf)
md= sf.Object_name
md_metadata = At.describe()
df_md_metadata = pd.DataFrame(At_metadata.get('fields'))
df_md_metadata.to_csv('md_metadata.csv',index=False)
df_md_metadata[['label','name','type']]
columns = """Id,ParentId,ActivityId,CreatedById,CreatedDate,LastModifiedDate,LastModifiedById,SystemModstamp,TextBody,HtmlBody,Headers,Subject,FromName,FromAddress,ValidatedFromAddress,ToAddress,CcAddress,BccAddress,Incoming,HasAttachment,Status,MessageDate,IsDeleted,ReplyToEmailMessageId,IsExternallyVisible,MessageIdentifier,ThreadIdentifier,IsClientManaged"""
columns
querySQQL = "select {} from Object_name".format(columns)
print(querySQQL)
response = sf.query(querySQQL)
lstRecords = response.get('records')
nextRecordsUrl = response.get('nextRecordsUrl')
print(response.get('totalSize'))#This will print the total Size of the record that are present in the particular object
while not response.get('done'):
response = sf.query_more(nextRecordsUrl, identifier_is_url=True)
lstRecords.extend(response.get('records'))
nextRecordsUrl = response.get('nextRecordsUrl')
final_insert = pd.DataFrame(lstRecords).drop('attributes',axis=1)
final_insert.shape
final_insert.Id.nunique()
df_em = pd.DataFrame()
df_em['Old_SF_ID__c'] = final_insert['Id']
df_em["BccAddress"]=final_insert["BccAddress"]
df_em["CcAddress"]=final_insert["CcAddress"]
df_em["ValidatedFromAddress__c"]=final_insert["ValidatedFromAddress"]
df_em["FromAddress"]=final_insert["FromAddress"]
df_em["FromName"]=final_insert["FromName"]
df_em["Headers"]=final_insert["Headers"]
df_em["HtmlBody"]=final_insert["HtmlBody"]
df_em["IsExternallyVisible"]=final_insert["IsExternallyVisible"]
df_em["Incoming"]=final_insert["Incoming"]
df_em["MessageDate"]=final_insert["MessageDate"]
df_em["Status"]=final_insert["Status"]
df_em["Subject"]=final_insert["Subject"]
df_em["TextBody"]=final_insert["TextBody"]
df_em["ToAddress"]=final_insert["ToAddress"]
In Salesforce Org we can not insert the null values. So we have to deal with the null values by filling with blank values.
df_em.fillna('',inplace = True)
df_em.shape
df_em.isnull().sum()
username = Salesforce_two.username
password = Salesforce_two.password
security_token = Salesforce_two.security_token
domain = 'login'
session_id, sf_instance = SalesforceLogin(username=username, password=password, security_token=security_token,domain=domain)
sf = Salesforce(instance=sf_instance,session_id=session_id)
print(sf)
project = SFType('Object_name',session_id,sf_instance)
#using Bulk Api to insert the data
bulk = SalesforceBulk(sessionId=session_id, host=urlparse('http://'+sf_instance).hostname)
job = bulk.create_insert_job("Object_name", contentType='CSV',concurrency='Parallel')
for i in range(0,len(df_em),100): # this is to specify no of records u want to enter in each iteration
df=[] # which is totally depends on the size of the data.
df = df_em[i:i+10000]
res1=df.to_dict(orient='records')
csv_iter = CsvDictsAdapter(iter(res1))
batch = bulk.post_batch(job, csv_iter)
result=bulk.wait_for_batch(job, batch)
bulk.close_job(job) #Most important step to close the job