как запросить гаечный ключ и получить метаданные, особенно имена столбцов?

Я пытаюсь запросить пользовательский SQL на Spanner и преобразовать результаты в фрейм данных Pandas, поэтому мне нужны данные и имена столбцов, но я не могу найти способ получить имена столбцов.

Согласно документации, я могу получать столбцы, используя свойства метаданных или полей. , но это не работает.

Я попытался запустить транзакцию запроса, а также получить снимок, но я просто получил строку данных.


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.


person Adamo Figueroa    schedule 08.08.2019    source источник


Ответы (1)


Прежде чем метаданные станут доступны, необходимо получить хотя бы одну строку. Поэтому, если вы измените порядок кода, чтобы сначала получить данные (или, по крайней мере, некоторые данные), а затем получить метаданные, это должно сработать.

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) доступна только при профилировании запроса. Когда вы просто выполняете запрос, как в приведенном выше примере, он всегда будет пустым.

person Knut Olav Løite    schedule 09.08.2019