10

我正在使用 Python Simple-Salesforce 通过 SOQL 查询数据。我知道 SOQL 语法不支持“SELECT *”,所以我想创建一个 Python 脚本来收集所有字段的字符串列表以插入到 SELECT 语句中。下面是我描述帐户对象的方式:

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)

我应该如何从如下所示的有序字典中将字段名称提取到字符串列表中?

描述

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'), ......

我将使用字符串列表来选择所有字段:

query = sf.query_all("SELECT string_list FROM Account")
4

3 回答 3

26

我应该如何从如下所示的有序字典中将字段名称提取到字符串列表中?

我已扩展您的代码以包含解决方案

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)

我意识到这个问题是不久前发布的,只是希望它有一个完整的解决方案。

于 2018-03-01T22:38:33.467 回答
1

这个python库描述调用可以在这里看到:

https://github.com/simple-salesforce/simple-salesforce/blob/d2ba65e977730ce987ca7d3c38e0f8965d99eec1/simple_salesforce/api.py#L184

如果我是你,我会追溯他们最初是如何获得有序词典的。

从这一行可以看出:

https://github.com/simple-salesforce/simple-salesforce/blob/d2ba65e977730ce987ca7d3c38e0f8965d99eec1/simple_salesforce/api.py#L187

他们使用此处的基本 URL:

https://github.com/simple-salesforce/simple-salesforce/blob/d2ba65e977730ce987ca7d3c38e0f8965d99eec1/simple_salesforce/api.py#L173

有了它,您可以在 Workbench 中进行相同的调用:

https://workbench.developerforce.com/login.php

通过简单的谷歌搜索,您可以找到一些关于如何遍历字典的有用示例,这里有一些:

如何做到这一点 - python字典遍历和搜索

循环遍历所有嵌套的字典值?

遍历/迭代任意深度的嵌套字典(字典表示目录树)

只要您知道要查找的内容,遍历字典就应该相当容易。

警告的话,根据我的经验,查询所有字段对于FFLib 之类的企业框架非常有用,但是有些对象并非设计为在一个 SOQL 查询中包含所有字段。

请参阅此页面了解 SOQL 限制:

https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_limits.htm

希望这可以帮助。

于 2017-11-28T18:52:56.763 回答
0
# 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}"
于 2021-07-30T12:13:37.740 回答