如何查询扳手并获取元数据,尤其是列名?

how to query spanner and get metadata, especially columns' names?

我正在尝试在 Spanner 上查询自定义 SQL 并将结果转换为 Pandas Dataframe,因此我需要数据和列名,但我找不到获取方法列名。

根据 documentation,我可以使用元数据或字段属性获取列,但这不起作用。

我尝试 运行 查询事务并获取快照,但我只获取了一个数据行。


from google.cloud import spanner
from google.cloud.spanner_v1.streamed import StreamedResultSet

def query_transaction(instance_id, database_id, query_param):

    spanner_client = spanner.Client.from_service_account_json("PATH_XXXXX")
    database = spanner_client.instance(instance_id).database(database_id)

    def run_transaction(transaction):
        query = query_param
        results: StreamedResultSet = transaction.execute_sql(query)
        print("type", type(results))
        print("metadata", results.stats)
        for row in results:
            print(row)

    database.run_in_transaction(run_transaction)

def query_snapshot(instance_id, database_id, query):

    spanner_client = spanner.Client.from_service_account_json("PATH_XXXXX")
    database = spanner_client.instance(instance_id).database(database_id)

    with database.snapshot() as snapshot:
        results: StreamedResultSet = snapshot.execute_sql(query)

        print("metadata", results.metadata)
        print("type", type(results))

        for row in results:
            print(row)


spanner_id = "XXXXXXX"
base_id = "XXXXXXXX"
query ="SELECT * FROM XXXXX LIMIT 5"

spanner.query_snapshot(spanner_id, base_id, query)
spanner.query_transaction(spanner_id, base_id, query)


我可以迭代结果并获取行,但元数据始终是 None。

在元数据可用之前,您必须至少提取一行。因此,如果您要更改代码的顺序,以便首先获取数据(或至少一些数据),然后获取元数据,它应该可以工作。

results: StreamedResultSet = snapshot.execute_sql(query)
print("metadata", results.metadata)
for row in results:
    print(row)

进入这个:

results: StreamedResultSet = snapshot.execute_sql(query)
for row in results:
    print(row)
print("metadata", results.metadata)

那么您应该获取元数据。

另请注意,结果集统计信息 (results.stats) 仅在分析查询时可用。当您刚刚执行查询时,就像您在上面的示例中一样,这将始终为空。