ariasantony
ariasantony

Reputation: 11

Error to connect firestore to store an API result made at Cloud Shell with Python

I just want to learn how to store data in Firestore using Python and Google Cloud Platform, so I'm calling an API to query some example data. For it, I'm using requests library and Firebase library from google.cloud package.

Here is the code that I'm running at Cloud Shell:

import requests
from google.cloud import firestore

url = "https://api.coindesk.com/v1/bpi/currentprice.json"

r = requests.get(url)
resp: str = r.text

if not (resp=="null" or resp=="[]"):
    db = firestore.Client()
    doc_ref=db.collection("CoinData").add(r.json())

When the code try to connect to Firebase to add the json of the API response I got this error:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/grpc_helpers.py", line 66, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/grpc/_channel.py", line 946, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.7/dist-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking
    raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.INVALID_ARGUMENT
        details = "Invalid resource field value in the request."
        debug_error_string = "{"created":"@1634689546.004704998","description":"Error received from peer ipv4:74.125.134.95:443","file":"src/core/lib/surface/call.cc","file_line":1070,"grpc_message":"Invalid resource field value in the request.","grpc_status":3}"
>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/antonyare_93/cloudshell_open/pruebas/data_coin_query.py", line 11, in <module>
    doc_ref=db.collection("CoinData").add(r.json())
  File "/home/antonyare_93/.local/lib/python3.7/site-packages/google/cloud/firestore_v1/collection.py", line 107, in add
    write_result = document_ref.create(document_data, **kwargs)
  File "/home/antonyare_93/.local/lib/python3.7/site-packages/google/cloud/firestore_v1/document.py", line 99, in create
    write_results = batch.commit(**kwargs)
  File "/home/antonyare_93/.local/lib/python3.7/site-packages/google/cloud/firestore_v1/batch.py", line 60, in commit
    request=request, metadata=self._client._rpc_metadata, **kwargs,
  File "/home/antonyare_93/.local/lib/python3.7/site-packages/google/cloud/firestore_v1/services/firestore/client.py", line 815, in commit
    response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,)
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/gapic_v1/method.py", line 142, in __call__
    return wrapped_func(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/retry.py", line 288, in retry_wrapped_func
    on_error=on_error,
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/retry.py", line 190, in retry_target
    return target()
  File "/usr/local/lib/python3.7/dist-packages/google/api_core/grpc_helpers.py", line 68, in error_remapped_callable
    raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.InvalidArgument: 400 Invalid resource field value in the request.

Anyone knows how I can fix it?

Upvotes: 0

Views: 1039

Answers (1)

ariasantony
ariasantony

Reputation: 11

I've just got it.

It was a little mistake, I was missing the name of the project at the firestore client method call, here's the code working:

import requests
from google.cloud import firestore


url = "https://api.coindesk.com/v1/bpi/currentprice.json"

r = requests.get(url)
resp: str = r.text

if not (resp=="null" or resp=="[]"):
    db = firestore.Client(project="mytwitterapitest")
    doc_ref=db.collection("CoinData").add(r.json())

Upvotes: 1

Related Questions