simple_salesforce python中的父子关系查询,从有序字典中提取

问题描述

Pandas是用于表格数据的出色工具。但是,尽管它可以包含Python对象,但这并不是它的甜头。我建议您在将数据插入到之前先从查询提取数据pandas.Dataframe

提取记录:

提取所需字段作为词典列表很容易:

records = [dict(id=rec['Id'], country=rec['Account']['BillingCountry'])
           for rec in data['records']]

将记录插入数据框:

有了字典列表,数据框就很容易了:

df = pd.DataFrame(records)

测试代码

import pandas as pd
from collections import OrderedDict

data = OrderedDict([
    ('totalSize', 455),
    ('done', True),
    ('records', [
        OrderedDict([
            ('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')])),
            ('Id', '0061B003451RhZgiHHF'),
            ('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0013000000MvkRQQAZ')])),
                                     ('BillingCountry', 'United States')])),
        ]),
        OrderedDict([
            ('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001Pa52QQAR')])),
            ('Id', '0061B00001Pa52QQAR'),
            ('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001vQPxqAAG')])),
                                     ('BillingCountry', 'United States')])),
        ]),
        OrderedDict([
            ('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001TRu5mQAD')])),
            ('Id', '0061B00001TRu5mQAD'),
            ('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001rfRTrAAE')])),
                                     ('BillingCountry', 'United States')])),
        ]),
    ])
])

records = [dict(id=rec['Id'], country=rec['Account']['BillingCountry'])
           for rec in data['records']]
for r in records:
    print(r)

print(pd.DataFrame(records))

试验结果:

{'country': 'United States', 'id': '0061B003451RhZgiHHF'}
{'country': 'United States', 'id': '0061B00001Pa52QQAR'}
{'country': 'United States', 'id': '0061B00001TRu5mQAD'}

         country                   id
0  United States  0061B003451RhZgiHHF
1  United States   0061B00001Pa52QQAR
2  United States   0061B00001TRu5mQAD

解决方法

我正在尝试使用simple_salesforcepython中的包从salesforce查询信息。

问题是它是作为父子关系的一部分的嵌套字段到有序字典中的有序字典中的嵌套字段

我想从商机对象中查找ID和与该记录关联的accountid。

SOQL查询可能看起来像..

query = "select id,account.id from opportunity where closedate = last_n_days:5"

在SOQL(salesforce对象查询语言)中,点表示数据库中的父子关系。因此,我尝试从机会对象中获取ID,然后从该记录中的帐户对象中获取相关ID。

出于某种原因,Id可以正常使用,但是account.id嵌套在有序字典中的有序字典中:

q = sf.query_all(query)

这会拉回有序的字典。

OrderedDict([('totalSize',455),('done',True),('records',[OrderedDict([('attributes',OrderedDict([('type','Opportunity'),('url',

我会拉records一块ordereddict来创建一个df

df = pd.DataFrame(q['records'])

这给了我3列,一个叫dict的命令'attributes'Id另一个叫dict的命令'Account'。我正在寻找一种('BillingCountry','United States')从嵌套有序字典中提取片断的方法'Account'

[OrderedDict([('attributes','/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')])),('Id','0061B003451RhZgiHHF'),('Account',OrderedDict([('attributes','Account'),'/services/data/v34.0/sobjects/Account/001304300MviPPF3Z')])),('BillingCountry','United States')]))])

编辑:澄清我在找什么。

我想以每个查询字段的一列为数据帧结尾。

当我'records'使用df = pd.DataFrame(sf.query_all(query)['records'])它把它放到一个DataFrame中时,它给了我:

attributes  Id  Account
OrderedDict([('type','/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')])    0061B003451RhZgiHHF OrderedDict([('attributes','/services/data/v34.0/sobjects/Account/0013000000MvkRQQAZ')])),'United States')])
OrderedDict([('type','/services/data/v34.0/sobjects/Opportunity/0061B00001Pa52QQAR')]) 0061B00001Pa52QQAR  OrderedDict([('attributes','/services/data/v34.0/sobjects/Account/0011300001vQPxqAAG')])),'/services/data/v34.0/sobjects/Opportunity/0061B00001TRu5mQAD')]) 0061B00001TRu5mQAD  OrderedDict([('attributes','/services/data/v34.0/sobjects/Account/0011300001rfRTrAAE')])),'United States')])

删除'attributes'列后,我希望输出为

Id BillingCountry
0061B003451RhZgiHHF 'United States'
0061B00001Pa52QQAR 'United States'
0061B00001TRu5mQAD 'United States'