代码之家  ›  专栏  ›  技术社区  ›  Matt W.

simple\u salesforce python中的父子关系查询,从有序dict中提取

  •  6
  • Matt W.  · 技术社区  · 7 年前

    我正在尝试使用 simple_salesforce python中的包。

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

    我想要。。从Opportunity对象中,查找id以及与该记录关联的accountid。

    SOQL查询可能看起来像。。

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

    在SOQL(salesforce对象查询语言)中,点表示数据库中的父子关系。因此,我试图从opportunity对象获取id,然后从该记录上的account对象获取相关id。

    由于某种原因,身份证很好,但是账户。id嵌套在有序dict中的有序dict中:

    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') 嵌套有序dict的片段 '帐户'

    [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/001304300MviPPF3Z')])),
                                ('BillingCountry', 'United States')]))])
    

    编辑:澄清我在寻找什么。

    我想以一个数据框结束,其中每个查询字段都有一列。

    当我把 'records' 使用 df = pd.DataFrame(sf.query_all(query)['records']) 它给了我:

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

    在我移除 '属性' 我希望输出为的列

    Id BillingCountry
    0061B003451RhZgiHHF 'United States'
    0061B00001Pa52QQAR 'United States'
    0061B00001TRu5mQAD 'United States'
    
    2 回复  |  直到 7 年前
        1
  •  10
  •   Stephen Rauch Madhusudan Sharma    7 年前

    Pandas是表格数据的神奇工具。尽管它可以包含Python对象,但这并不是它的最佳选择。我建议您在将数据插入到 pandas.Dataframe :

    提取记录:

    要将所需字段提取为词典列表,只需执行以下操作:

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

    将记录插入数据框:

    有了DICT列表,数据帧非常简单:

    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
    
        2
  •  2
  •   Michael H.    6 年前

    熊猫可以阅读有序的口述。

    import pandas as pd
    from simple_salesforce import Salesforce
    
    sf = Salesforce(username='your_username',   
                    password='your_password',
                    security_token='your_token')
    
    query = "select id, account.id from opportunity where closedate = last_n_days:5"
    df = pd.DataFrame(sf.query_all(query)['records']).drop(columns='attributes')