Solved

Pegar todos os registros de um database

  • 1 February 2022
  • 5 replies
  • 686 views

Userlevel 4

Olá pessoal,

estou tentando montar uma query para puxar todos os registros de um database de clientes juntamente com os campos desses registros.(ex nome, telefone, cpf, etc).

Estou fazendo um teste simples primeiro para puxar o nome do database e estou obtendo o seguinte retorno :

import requests

 

url = "https://api.pipefy.com/graphql"

 

payload = {"query": "{ table( id: ms**-***) { name } }"}

headers = {

    "authorization": "Bearer ******** ",

    "content-type": "application/json"

}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)  

 

E o retorno: 

{"errors":[{"message":"Parse error on \"-\" (error) at [1, 18]","locations":[{"line":1,"column":18}]}]}

 

Qual a minha ideia: preciso puxar esses dados diariamente atualizados para uma planilha do drive, porém não queria ter que baixar o relatório toda vez, então pensei em colocar um código no google sheets para que atualizasse automaticamente todo dia.

É possível fazer isso?

Desde já agradeço

icon

Best answer by Lucas Democh 2 February 2022, 15:41

View original

5 replies

Userlevel 7
Badge +15

Olá @joaogalhardo,

 

É possível sim!

 

Segue código em Python para extração.

 

Esta query já está preparada para tabelas com mais de 50 registros. Basta você informar o ID da tabela, token e o nome do arquivo. Você pode deixar o parâmetro de table_fields em brando para que todos os campos sejam baixados.

 

import requests
import pandas as pd
import json

#PAYLOAD

table_id = "XXXXXX"
pipefy_token = 'XXXXXX'
table_fields = [""]
nome_arquivo = 'XXXXXX'


url = "https://api.pipefy.com/graphql"

headers = {
"authorization": f"Bearer {pipefy_token}",
"content-type": "application/json"
}

df = pd.DataFrame(columns=table_fields)

has_next_page = True
first_query = True

while(has_next_page):

if first_query:
payload = {"query": "{ table_records(table_id:\""+table_id+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ table_records(table_id:\""+table_id+"\",after:\""+end_cursor+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}

response = requests.request("POST", url, json=payload, headers=headers)

json_data = json.loads(response.text)
end_cursor = json_data["data"]["table_records"]["pageInfo"]["endCursor"]
has_next_page = json_data["data"]["table_records"]["pageInfo"]["hasNextPage"]
total_records_pg = len(json_data["data"]["table_records"]["edges"])

for i in range(total_records_pg):
card_title = json_data["data"]["table_records"]["edges"][i]["node"]["title"]
card_data_d = json_data["data"]["table_records"]["edges"][i]["node"]["record_fields"]
card_data = {x['name']:x['value'] for x in card_data_d}
df = df.append(card_data, ignore_index=True)

 

Na sequência, você pode transformar o DF para o formato que você desejar.

 

No meu caso, eu gravo um JSON no S3 da Amazon ou no Google Big Query.

 

  

Userlevel 4

Olá @joaogalhardo,

 

É possível sim!

 

Segue código em Python para extração.

 

Esta query já está preparada para tabelas com mais de 50 registros. Basta você informar o ID da tabela, token e o nome do arquivo. Você pode deixar o parâmetro de table_fields em brando para que todos os campos sejam baixados.

 

import requests
import pandas as pd
import json

#PAYLOAD

table_id = "XXXXXX"
pipefy_token = 'XXXXXX'
table_fields = [""]
nome_arquivo = 'XXXXXX'


url = "https://api.pipefy.com/graphql"

headers = {
"authorization": f"Bearer {pipefy_token}",
"content-type": "application/json"
}

df = pd.DataFrame(columns=table_fields)

has_next_page = True
first_query = True

while(has_next_page):

if first_query:
payload = {"query": "{ table_records(table_id:\""+table_id+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ table_records(table_id:\""+table_id+"\",after:\""+end_cursor+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}

response = requests.request("POST", url, json=payload, headers=headers)

json_data = json.loads(response.text)
end_cursor = json_data["data"]["table_records"]["pageInfo"]["endCursor"]
has_next_page = json_data["data"]["table_records"]["pageInfo"]["hasNextPage"]
total_records_pg = len(json_data["data"]["table_records"]["edges"])

for i in range(total_records_pg):
card_title = json_data["data"]["table_records"]["edges"][i]["node"]["title"]
card_data_d = json_data["data"]["table_records"]["edges"][i]["node"]["record_fields"]
card_data = {x['name']:x['value'] for x in card_data_d}
df = df.append(card_data, ignore_index=True)

 

Na sequência, você pode transformar o DF para o formato que você desejar.

 

No meu caso, eu gravo um JSON no S3 da Amazon ou no Google Big Query.

 

  

Fantástico Lucas! Muito obrigado pela sua resposta.

Me deparei com um outro problema. Quando uso o loop for para rodar entre os registros, acontece o seguinte:
 

exemplo de registro 1: 

[ { name: 'Nome', report_value: 'Joao' },
{ name: 'CPF', report_value: '' },
{ name: 'FGTS', report_value: '2.000,00' },
{ name: 'Subsídio', report_value: '1.750,00' },
{ name: 'Bonificaçao', report_value: '4.000,00' },
{ name: 'Entrada', report_value: '23.700,00' },
{ name: 'Financiamento', report_value: '128.000,00' } ]

Exemplo de registro 2: 

[ { name: 'Nome', report_value: 'Joice' },
{ name: 'CPF', report_value: '' },
{ name: 'Financiamento', report_value: '110.800,00' },
{ name: 'FGTS', report_value: '2.329,91' },
{ name: 'Subsídio', report_value: '1.755,00' },
{ name: 'Bonificaçao', report_value: '4.000,00' },
{ name: 'Entrada', report_value: '19.621,93' },
{ name: 'Fase Atual', report_value: 'Caixa de entrada' } ]

percebe que os índices da lista variam conforme o registro, ou seja, a coluna “Financiamento” que antes estava no índice [6] no registro 1, foi para o índice [2] no registro 2. Não sei porque isso está acontecendo sendo que o código é o mesmo. Você tem alguma ideia de como corrigir ou por que isso acontece?

Abraço

Userlevel 7
Badge +15

@joaogalhardo pelo menos na minha IDE Python, independente da ordem de cada campo, ele está organizando de acordo com o nome do campo (por isso eu puxo o nome e valor record_fields {name value} ignoro o índice na última linha do código.

Você chegou a visualizar o data frame? Ele está embaralhando o conteúdo dos campos?

 

 

Userlevel 2
Badge

O que coloco no table_id ?

Userlevel 7
Badge +15

@wenceslau-16-diego você coloca o ID da tabela do Pipefy que você deseja consultar.

 

O ID é o número que aparece no final da URL quando você acessa a tabela dentro do Pipefy:

 

 

Reply