# CartoDB

El BackEndBase permite utilizar la API SQL de CartoDB (opens new window) para insertar, actualizar o eliminar datos.

Ejemplo: Insertar una nueva columna con datos de latitud y longitud ó seleccionar datos de tablas públicas para usarlos en tu aplicación.

La versíon soportada aquí, es la SQL API v2

# Configuración

En el archivo app/config/cartodb.py se establecen la url, el nombre de la cuenta y la api key de CartoDB, necesarios para el correcto funcionamiento del módulo.

# app/config/cartodb.py

CARTODB_URI = "https://{0}.cartodb.com/api/v2/sql"
CARTODB_ACCOUNT = 'awesome_cartodb_account'
CARTODB_API_KEY = 'awesome_cartodb_api_key'

# Utilizando cartoDB SQL API

Este módulo tiene 3 funciones:

# sql_api

La función sql_api espera un solo parametro:

  • sql: La consulta SQL válida, que será enviada a la API SQL de CartoDB.
def sql_api(sql=None):
    ...

Ejemplo:

from app.ext.cartodb import sql_api
...

query = "SELECT cartodb_id, the_geom, latitude, longitude FROM awesome_dataset"
resp = sql_api(query)

if resp is None:
    return Rest.response(400, HttpStatus.DEFAULT_ERROR_MESSAGE, resp)
else:
    Rest.response(200, HttpStatus.OK, resp)

El resultado del ejemplo anterior:

{
  "rows": [
    {
      "cartodb_id":582156,      
      "the_geom": "0103000020E610000001000000050000002FFF3F29308452C0F13E5909FCAF12402FFF3F16258452C0D866879889B012402FFFBF3A268452C055DEE957A9AF12402FFFBF91298452C0F126F7E276AF12402FFF3F29308452C0F13E5909FCAF1240",
      "latitude":"4.36895",
      "longitude":"-47.69842"
    }
  ],
  "time": 0.035,
  "fields": {
    "the_geom": {
      "type": "geometry",
      "wkbtype": "Unknown",
      "dims": 2,
      "srid": 4326
    },
    "cartodb_id": {
      "type": "integer",
      "pgtype": "text"
    },
    "latitude": {
      "type": "float",
      "pgtype": "text"
    },
    "longitude": {
      "type": "float",
      "pgtype": "text"
    }
  },
  "total_rows": 1
}

la Api de CartoDB devuelve los resultados en un campo llamado rows, si la consulta fue exitosa, de lo contrario, detalla el posible error en el campo error.

{
  "error": [
    "column \"latitud\" does not exist"
  ],
  "hint": "Perhaps you meant to reference the column \"awesome_dataset.table_name\"."
}

# create_job

La función create_job crea un trabajo de consultas por lotes (job) que le permite realizar operaciones sobre CartoDB, con tiempos de procesamiento de CPU de larga duración.

La función create_job espera un solo parametro:

  • sql: La consulta SQL válida, que será enviada a la API SQL de CartoDB.
def create_job(sql=None):
    ...

Ejemplo:

from app.ext.cartodb import create_job
...

query = "SELECT cartodb_id, the_geom, latitude, longitude FROM awesome_dataset"
resp = create_job(query)

if resp is None:
    return Rest.response(400, HttpStatus.DEFAULT_ERROR_MESSAGE, resp)
else:
    Rest.response(200, HttpStatus.OK, resp)

El resultado del ejemplo anterior:

{
  "user": "awesome_cartodb_account",
  "query": "SELECT cartodb_id, the_geom, latitude, longitude FROM awesome_dataset",
  "job_id": "69c9d24d-62f6-4dbb-9836-712103e56841",
  "created_at": "2020-07-09T18:25:17.412Z",
  "updated_at": "2020-07-09T18:25:17.412Z",
  "status": "pending"
}

la Api de Jobs de CartoDB devuelve el resultado del job, en los campos job_id y status si la consulta fue exitosa, de lo contrario, detalla el posible error en el campo failed_reason.

{
  "user": "awesome_cartodb_account",
  "status": "failed",
  "query": "SELECT cartodb_id, the_geom, latitud, longitude FROM awesome_dataset",
  "created_at": "2020-07-09T18:29:08.059Z",
  "updated_at": "2020-07-09T18:29:08.074Z",
  "failed_reason": "column \"latitud\" does not exist",
  "job_id": "221683f2-2782-4x05-b810-1234aea790a2"
}

# get_job

La función get_job devuelve el estado de un trabajo de consultas por lotes en función de su ID (job_id)

La función get_job espera un solo parametro:

  • job_id: el Id del Job.
def get_job(job_id=None):
    ...

Ejemplo:

from app.ext.cartodb import get_job
...

job_id = "69c9d24d-62f6-4dbb-9836-712103e56841"
resp = get_job(job_id)

if resp is None:
    return Rest.response(400, HttpStatus.DEFAULT_ERROR_MESSAGE, resp)
else:
    Rest.response(200, HttpStatus.OK, resp)

El resultado del ejemplo anterior:

{
  "user": "awesome_cartodb_account",
  "status": "done",
  "query": "SELECT cartodb_id, the_geom, latitude, longitude FROM awesome_dataset",
  "created_at": "2020-07-09T18:25:17.412Z",
  "updated_at": "2020-07-09T18:25:17.612Z",
  "job_id": "69c9d24d-62f6-4dbb-9836-712103e56841"
}

la Api de Jobs de CartoDB devuelve el resultado del job, en los campos job_id y status si la consulta fue exitosa, de lo contrario, detalla el posible error en el campo failed_reason.

{
  "user": "awesome_cartodb_account",
  "status": "failed",
  "query": "SELECT cartodb_id, the_geom, latitud, longitude FROM awesome_dataset",
  "created_at": "2020-07-09T18:29:08.059Z",
  "updated_at": "2020-07-09T18:29:08.074Z",
  "failed_reason": "column \"latitud\" does not exist",
  "job_id": "221683f2-2782-4x05-b810-1234aea790a2"
}

# Más información

Para mas información consulte: