【问题标题】:Getting column header from snowflake table using python snowflake connector使用 python 雪花连接器从雪花表中获取列标题
【发布时间】:2023-08-02 07:17:01
【问题描述】:

如何使用雪花连接器游标获取表数据以及列名。 好吧,我可以使用 dictcursor 获得它,但是合并结果集变得很复杂,因为它将所有数据作为密钥对。 我想知道是否有任何直接的方法。

【问题讨论】:

    标签: python snowflake-cloud-data-platform


    【解决方案1】:

    要获取列标题,您可以使用光标的description 属性,该属性返回结果的元数据并描述为here

    像下面这样使用它:

    import snowflake.connector
    import os
    
    snowflake_username = os.environ['SNOWFLAKE_USERNAME']
    snowflake_password = os.environ['SNOWFLAKE_PASSWORD']
    snowflake_account = os.environ['SNOWFLAKE_ACCOUNT']
    snowflake_warehouse = os.environ['SNOWFLAKE_WAREHOUSE']
    snowflake_database = 'sample_data'
    snowflake_schema = 'tpch_sf1'
    
    
    if __name__ == '__main__':
        with snowflake.connector.connect(
                user=snowflake_username,
                password=snowflake_password,
                account=snowflake_account,
                warehouse=snowflake_warehouse,
                database=snowflake_database,
                schema=snowflake_schema,
                autocommit=False
        ) as con:
            # Execute cursor and print metadata
            cursor = con.cursor().execute("select * from sample_data.TPCH_SF1.customer limit 10")
            for c in cursor.description:
                print(c)
    
            # # Fetch and print results
            # results = cursor.fetchall()
            # print(results)
    

    上面打印出来:

    ('C_CUSTKEY', 0, None, None, 38, 0, False)
    ('C_NAME', 2, None, 25, None, None, False)
    ('C_ADDRESS', 2, None, 40, None, None, False)
    ('C_NATIONKEY', 0, None, None, 38, 0, False)
    ('C_PHONE', 2, None, 15, None, None, False)
    ('C_ACCTBAL', 0, None, None, 12, 2, False)
    ('C_MKTSEGMENT', 2, None, 10, None, None, True)
    ('C_COMMENT', 2, None, 117, None, None, True)
    

    【讨论】:

      【解决方案2】:

      我有同样的问题,在 Jupyter 笔记本中使用 python 雪花连接器。我使用数据框,因此根据上面@SimonD 的回答,我将cursor.description 的部分改编为:

      hdrs = pd.DataFrame(cursor.description)

      df = pd.DataFrame(sql_data)

      根据我的数据,生成的hdrs 数据框有一个属性“名称”,我可以使用该属性为df 数据框设置列名,如下所示:

      df.columns = hdrs['name']

      【讨论】: