1 votos

No se puede cambiar el nombre de un conjunto de datos antiguo e importar/cargar uno nuevo con el nombre original: Omisión de la vinculación de tablas fantasma

Estoy intentando ejecutar un script que renombra el conjunto de datos carto existente a {CARTO_DATASET_NAME}_previous y luego utiliza la api de importación para cargar un archivo con el nombre original {CARTO_DATASET_NAME}. El problema con esto es que el nuevo archivo importado no se crea con {CARTO_DATASET_NAME} como se deseaba, de hecho se crea con un nombre de conjunto de datos {CARTO_DATASET_NAME}_1.

Esto es lo que hago para renombrar el conjunto de datos:

query = f'ALTER TABLE {CARTO_RAW_TABLE} RENAME to {CARTO_RAW_TABLE}_prev;'
req_url = f'{CARTO_URL}/user/{CARTO_USER}/api/v2/sql?q={query}&api_key={CARTO_API_KEY}'
res = rq.get(req_url)

La respuesta devuelve este texto

Invalidation service configuration not found. Skipping Ghost Tables linking.'], 'notices': ['_CDB_LinkGhostTables() called with username=dev, event_name=ALTER TABLE']

Como he dicho anteriormente después de renombrar el conjunto de datos original, entonces subo el nuevo:

upload_url = f'{CARTO_URL}/user/{CARTO_USER}/api/v1/imports/?api_key={CARTO_API_KEY}'

with open(csv_fname,'rb') as file_:
    try:
        res = rq.post(url = upload_url, verify = False,  files = {'file': file_})
    except TimeoutError:
        raise TimeoutError("Error uploading csv file to carto")
    else:
        print('started uploading raw dataset to carto...')

Supongo que hay algún problema al renombrar el conjunto de datos original y éste sigue existiendo con el nombre original, no teniendo la cláusula ALTER TABLE el efecto deseado.

0voto

Computerology Puntos 21

Suelo evitar cambiar el nombre de las tablas cuando se trata de procesos ETL. Internamente CARTO debe tener sus propios procedimientos para hacer un seguimiento de las tablas y los ALTER TABLE declaración debe haber sido restringida.

Le sugiero que cambie de mentalidad con esta tarea:

Primera performa a:

DROP TABLE IF EXISTS {CARTO_RAW_TABLE}_prev;
CREATE TABLE {CARTO_RAW_TABLE}_prev AS
TABLE {CARTO_RAW_TABLE};

A continuación, utilice la API de importación para cargar el archivo, no se olvide de forzar el nombre para tener una _new sufijo. En caso contrario, CARTO añadirá el sufijo _1, _2, ... sufijo.

Tendrá que "importar" de nuevo desde {CARTO_RAW_TABLE}_new a CARTO_RAW_TABLE . Así.

DELETE {CARTO_RAW_TABLE};
INSERT INTO {CARTO_RAW_TABLE}
SELECT * FROM {CARTO_RAW_TABLE}_new;
DROP TABLE {CARTO_RAW_TABLE}_new; -- Important if not, when importing the file again it would have the `_new_1` suffix

Con este enfoque acabará teniendo 2 mesas: {CARTO_RAW_TABLE} con nuevos datos procedentes de la tabla de archivos API de importación, y {CARTO_RAW_TABLE}_prev con los datos anteriores.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X