basedosdados / mais

⚙️ Código de manutenção do datalake (metadados e pacotes de acesso) | 📖 Docs: https://basedosdados.github.io/mais/
https://info.basedosdados.org/links
MIT License
391 stars 88 forks source link

[infra] `Table.create` não envia o arquivo para o storage quando utilizo um projeto pessoal #1718

Closed aspeddro closed 1 month ago

aspeddro commented 2 months ago

Descrição Table.create não envia o arquivo para o storage quando utilizo um projeto pessoal. Na verdade ele envia para o storage basedosdados-dev

Reproduzir

Tenho uma configuração local para meu projeto em ~/bd-storage-teste e da basedosdados em ~./basedosdados

O pessoal:

bd-storage-test
├── config.toml
└── credentials
    ├── prod.json
    └── staging.json

Meu ~/bd-storage-test/config.toml:

# What is the bucket that you are saving all the data? It should be
# an unique name.
bucket_name = "playground-399304"

[gcloud-projects]

    [gcloud-projects.staging]
    name = "playground-399304"
    credentials_path = "/home/pedro/bd-storage-test/credentials/staging.json"

    [gcloud-projects.prod]
    name = "playground-399304"
    credentials_path = "/home/pedro/bd-storage-test/credentials/prod.json"

[api]
url = "https://staging.api.basedosdados.org/api/v1/graphql"

Um exemplo reprodutivel

python -m pip show basedosdados
Name: basedosdados
Version: 2.0.0b13
Summary: Organizar e facilitar o acesso a dados brasileiros através de tabelas públicas no BigQuery.
Home-page: https://github.com/basedosdados/mais
Author: Joao Carabetta
Author-email: joao.carabetta@gmail.com
License: MIT
Location: /home/pedro/Desktop/bd/bd-test-diff-project/.venv/lib/python3.9/site-packages
Requires: google-api-python-client, google-cloud-bigquery, google-cloud-bigquery-connection, google-cloud-bigquery-sto
rage, google-cloud-storage, loguru, pandas, pandas-gbq, pydata-google-auth, tomlkit, tqdm
Required-by:
import basedosdados as bd

DATASET_ID = "dataset_example"
TABLE_ID = "table_test_staging"
CONFIG_PATH = "bd-storage-test"
BUCKET_NAME = "playground-399304"

tb = bd.Table(
    dataset_id=DATASET_ID,
    table_id=TABLE_ID,
    config_path=CONFIG_PATH,
    bucket_name=BUCKET_NAME
)

# Não quero criar um dataset_staging apenas uma tabela staging em `dataset_example`
tb.table_full_name = dict(
    prod=f"{tb.client['bigquery_prod'].project}.{tb.dataset_id}.{tb.table_id}",
    staging=f"{tb.client['bigquery_staging'].project}.{tb.dataset_id}.{tb.table_id}",
)

tb.table_full_name["staging"] # 'playground-399304.dataset_example.table_test_staging'

tb.create("data.csv")

Primeiro erro:

Uploading files:   0%|                                             | 0/1 [00:00<?, ?it/s]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pedro/Desktop/bd/bd-test-diff-project/.venv/lib/python3.9/site-packages/bas
edosdados/upload/table.py", line 573, in create
    Storage(self.dataset_id, self.table_id).upload(
  File "/home/pedro/Desktop/bd/bd-test-diff-project/.venv/lib/python3.9/site-packages/bas
edosdados/upload/storage.py", line 218, in upload
    raise BaseDosDadosException(
basedosdados.exceptions.BaseDosDadosException: Data already exists at basedosdados-dev/st
aging/dataset_example/table_test_staging/data.csv. If you are using Storage.upload then s
et if_exists to 'replace' to overwrite data 
If you are using Table.create then set if_storage_data_exists to 'replace' to overwrite d
ata.

Vou adicionar if_storage_data_exists="replace"

tb.create("data.csv", if_storage_data_exists="replace")

O log reporta sucesso

Uploading files: 100%|█████████████████████████████████████| 1/1 [00:01<00:00,  1.04s/it]
2024-07-07 22:20:35.249 | SUCCESS  | basedosdados.upload.storage:upload:226 -  File data.
csv_staging was uploaded!
2024-07-07 22:20:38.835 | SUCCESS  | basedosdados.upload.table:create:668 - Table table_t
est_staging was created in staging!

A tabela foi criada:

image

A URI de origem da tabela aponta para gs://playground-399304/staging/dataset_example/table_test_staging/*, mas está vazio

image

Sem dados image

Na verdade o arquivo tá sendo criado no bucket basedosdados-dev

image

Se eu uso Storage passandos os parâmtetros o arquivo é enviado para o local certo

from basedosdados.upload.storage import Storage
st = Storage(dataset_id=DATASET_ID, table_id=TABLE_ID, config_path=CONFIG_PATH)
st.upload("data.csv", mode="staging")
Uploading files: 100%|█████████████████████████████████████| 1/1 [00:01<00:00,  1.09s/it]
2024-07-07 22:59:54.196 | SUCCESS  | basedosdados.upload.storage:upload:226 -  File data.
csv_staging was uploaded!

image

Comportamento esperado Ele deve enviar para o storage da conta pessoal

aspeddro commented 1 month ago

Fixed https://github.com/basedosdados/mais/pull/1719