Python 问:Simple Salesforce进行动态soql查询

Python 问:Simple Salesforce进行动态soql查询,python,salesforce,simple-salesforce,Python,Salesforce,Simple Salesforce,我在想办法让简单的salesforce只给我列表中的所有字段名。我想创建一个soql查询,它的功能与sql中的Select*差不多 对于对象中的obj: fields = [x["name"] for x in sf[obj].describe()["fields"]] 谢谢此方法将返回一个查询字符串,其中包含传入对象的所有字段。用户可以访问的所有字段 public static string getFullObjectQuery(String sObjectName){ Schema.SO

我在想办法让简单的salesforce只给我列表中的所有字段名。我想创建一个soql查询,它的功能与sql中的Select*差不多

对于对象中的obj:

fields = [x["name"] for x in sf[obj].describe()["fields"]]

谢谢

此方法将返回一个查询字符串,其中包含传入对象的所有字段。用户可以访问的所有字段

 public static string getFullObjectQuery(String sObjectName){
Schema.SObjectType convertType = Schema.getGlobalDescribe().get(sObjectName);
Map<String,Schema.sObjectField> fieldMap = convertType.getDescribe().Fields.getMap();
Set<String> fields = fieldMap.keySet();
String Query = 'SELECT ';
for(String field: fields){
  Schema.DescribeFieldResult dfr = fieldMap.get(field).getDescribe();
  if(dfr.isAccessible()){
    Query += field + ',';
  }
}
Query = query.SubString(0,Query.length() - 1);
Query += ' FROM ' + sObjectName;

return Query;
}
公共静态字符串getFullObjectQuery(字符串sObjectName){
Schema.SObjectType convertType=Schema.getGlobalDescribe().get(sObjectName);
Map fieldMap=convertType.getDescripte().Fields.getMap();
Set fields=fieldMap.keySet();
字符串查询='选择';
用于(字符串字段:字段){
Schema.descripebieldResult dfr=fieldMap.get(field.getDescripte();
if(dfr.isAccessible()){
查询+=字段+',';
}
}
Query=Query.SubString(0,Query.length()-1);
查询+='来自'+sObjectName;
返回查询;
}

对象中的字段名列表可以按如下方式实现:

def getObjectFields(obj):
    fields = getattr(sf,obj).describe()['fields']
    flist = [i['name'] for i in fields]
    return flist

getObjectFields('Contact')
您要获得
SELECT*
效果的查询将如下所示:

sf.query_all('SELECT {} FROM Contact LIMIT 10'.format(','.join(getObjectFields('Contact'))))

相关注释:

如果有帮助,可以按如下方式获得标签/名称对词典:

def getObjectFieldsDict(obj):
    fields = getattr(sf,obj).describe()['fields']
    fdict = {}
    for i in fields:
        fdict[i['label']] = i['name']
    return fdict

getObjectFieldsDict('Contact')

我发现这有助于找出标签不符合标准格式的字段名称(即“最喜爱的网站”字段名称的“我最喜爱的网站”字段标签)

是否确实需要选择所有字段?这通常被认为是一种不好的做法,可能会影响性能(对于Salesforce来说,这可能会导致达到极限)。我想为每个Sobject选择所有字段,因为我们想创建一个包含所有字段的数据湖。这看起来像Apex代码,我相信OP想要一个Python代码示例——您的dict答案非常有用。如果我想用名称/数据类型对创建一个字典怎么办?@gscott很乐意帮忙!要获得名称/数据类型对,您需要将
fdict[i['label']]=i['name']
行更改为
fdict[i['name']]=i['type']
。每个字段都有大量数据。只需运行
getattr(sf,obj).description()['fields']
,您将看到每个字段的每个数据点的列表(例如
长度
默认值
唯一
)。你可能不需要它们中的大多数,但是如果你需要的话,你可以找到它们。
def getObjectFieldsDict(obj):
    fields = getattr(sf,obj).describe()['fields']
    fdict = {}
    for i in fields:
        fdict[i['label']] = i['name']
    return fdict

getObjectFieldsDict('Contact')