Search code examples
pythonpython-3.xsalesforcebeatbox

Python3 + beatbox : Not able to querymore


I have logged into my SFDC org using instructions provided here http://tomhayden3.com/2013/08/04/salesforce-python/. However, I am not able to implement the queryMore part of it. It just does nothing. When I print(query_locator) it prints out an ID with a suffix -500. Can someone please look into this code and highlight what am I doing wrong?

#!/usr/bin/env python3

import beatbox

# Connecting to SFDC
sf = beatbox._tPartnerNS
service = beatbox.Client()
service.serverUrl = 'https://test.salesforce.com/services/Soap/u/38.0'
service.login('my-username', 'my-password')
query_result = service.query("SELECT id, Name, Department FROM User")
records = query_result['records']  # dictionary of results!
total_records = query_result['size']  # full size of results
query_locator = query_result['queryLocator']  # get the mystical queryLocator


# loop through, pulling the next 500 and appending it to your records dict
while query_result['done'] is False and len(records) < total_records:
    query_result = self._service.queryMore(query_locator)
    query_locator = query_result['queryLocator']  # get the updated queryLocator
    records = records + query_result['records']  # append to records dictionary
    print(records['id']) #This should print all IDs??? But it is not.

Solution

  • The examples here resolved the issue for me. https://github.com/superfell/Beatbox/blob/master/examples/export.py

    #!/usr/bin/env python3
    
    import beatbox
    import sqlalchemy
    
    engine_str = 'mysql+mysqlconnector://db-username:db-pass@localhost/db-name'
    engine = sqlalchemy.create_engine(engine_str, echo=False, encoding='utf-8')
    
    connection = engine.connect()
    
    sf = beatbox._tPartnerNS
    service = beatbox.Client()
    service.serverUrl = 'https://test.salesforce.com/services/Soap/u/38.0' #I hard quoted it since I was to test against sandbox only.
    
    def export(objectSOQL):
        service.login('sfdc-username', 'sfdc-pass')
        query_result = service.query(objectSOQL)
        while True:
            for row in query_result[sf.records:]:
                SQL_query = 'INSERT INTO user(' \
                            'id, ' \
                            'name, ' \
                            'department ' \
                            'VALUES(' \
                            '\"{}\",\"{}\",\"{}\")'\
                            .format(
                            row[2],
                            row[3],
                            row[4]
                            )
                try:
                    connection.execute(SQL_query)
                except Exception as e:
                    print(e)
    
        # This is key part which actually pulls records beyond 500 until sf.done becomes true which means the query has been completed. 
            if str(query_result[sf.done]) == 'true':
                break
            query_result = service.queryMore(str(query_result[sf.queryLocator]))
    
    SOQL = 'SELECT id, Name, Department FROM User'
    export(SOQL)