Reputation: 682
I'm using Python Simple-Salesforce to query data via SOQL. I know that "SELECT *" is not supported in SOQL syntax, so I want to create a Python script to gather a string list of all fields to insert into the SELECT statement. Below is how I am describing the Account Object:
from simple_salesforce import Salesforce
from simple_salesforce import SFType
#(credentials hidden)
sf = Salesforce(username=username, password=password,
security_token=security_token, sandbox=True,
client_id='mwheeler App')
desc = sf.Account.describe()
print(desc)
How should I extract the field names into a string list from the Ordered Dictionary shown below?
desc:
OrderedDict([('actionOverrides', []), ('activateable', False), ('childRelationships', [OrderedDict([('cascadeDelete', False), ('childSObject', 'Account'), ('deprecatedAndHidden', False), ('field', 'ParentId'), ('junctionIdListNames', []), ('junctionReferenceTo', []), ('relationshipName', 'ChildAccounts'), ('restrictedDelete', False)]), OrderedDict([('cascadeDelete', True), ('childSObject', 'AccountCleanInfo'), ('deprecatedAndHidden', False), ('field', 'AccountId'), ......
I will be using the string list to select all fields:
query = sf.query_all("SELECT string_list FROM Account")
Upvotes: 12
Views: 16734
Reputation: 29
# provide credential information for Salesforce Session Object
username = 'username'
password = 'password'
security_token = 'security_token'
domain = 'login'
# Create salesforce session
sf = Salesforce(username=username,
password=password,
security_token=security_token,
domain=domain)
# Get list of fields for TABLE
fields = [field.get('name') for field in getattr(sf, TABLE).describe().get('fields')]
# Concat fields ready for inclusion in query string
fields = ',\n'.join(fields)
# Convert into SOQL query
soql = f"SELECT \n{fields} \nFROM {TABLE}"
Upvotes: 1
Reputation: 425
How should I extract the field names into a string list from the Ordered Dictionary shown below?
I've extended your code to include the solution
from simple_salesforce import Salesforce
#(credentials hidden)
sf = Salesforce(username=username, password=password,
security_token=security_token, sandbox=True,
client_id='mwheeler App')
desc = sf.Account.describe()
# Below is what you need
field_names = [field['name'] for field in desc['fields']]
soql = "SELECT {} FROM Account".format(','.join(field_names))
results = sf.query_all(soql)
# Alternative method to retrieve results
# I don't have any recommendation which to use
results = sf.bulk.Account.query(soql)
I realize the question was posted a while ago, just want it to have a complete solution.
Upvotes: 34
Reputation: 624
This python library describe call can be seen here:
If I was you I would track back on how they got the Ordered Dictionary in the first place.
You can see from this line:
That they use the Base URL from here:
Having that you can make the same call in your Workbench:
https://workbench.developerforce.com/login.php
With a simple google search you can then find some useful examples on how to traverse the dictionary, here are a few:
How to do this - python dictionary traverse and search
Loop through all nested dictionary values?
As long as you know what you are looking for traversing a dictionary should be rather easy.
Word of warning, from my experience querying all the fields is great for Enterprise frameworks like FFLib, however some objects are not designed to have all fields in one SOQL Query.
Refer to this page for SOQL limits:
Hope this helps.
Upvotes: 1