Quelle est la façon la plus simple d'écrire des données dans CartoDB à l'aide de Python?

8

J'essaie d'écrire une fonction en Python qui utilisera l'API CartoDB pour écrire des données dans l'une de mes tables. Quelqu'un at-il un exemple simple qui montre comment faire cela que je peux utiliser pour commencer?

user29912
la source

Réponses:

6

L'écriture de données via l'API est assez simple. Voici le plus basique,

Supposons que nous ayons déjà deux variables, la façon de les obtenir dépend de vous,
username = 'cartodb-user-name'
apikey = 'MY-CARTODB-API-KEY'
Ensuite, permet de créer une instruction INSERT à utiliser
insert = "INSERT INTO my_table_name (the_geom, measure) VALUES (CDB_LatLng(43, -120), 22.0)"
Créez le point de terminaison URL pour notre API de compte
url = "https://%s.cartodb.com/api/v1/sql" % username
Créer un objet contenant les paramètres de notre demande
params = {
    'api_key' : apikey, # our account apikey, don't share!
    'q'       : insert  # our insert statement above
}
Envoyer la demande en utilisant urllib2
req = urllib2.Request(url, urllib.urlencode(params))
response = urllib2.urlopen(req)

CONFIGURATION: Vous devriez avoir quelques bibliothèques importées dans votre script python

import urllib
import urllib2

BONUS: Les inserts en lot sont bien meilleurs que les inserts à ligne unique.

Voici un exemple de stratégie d'insertion à plusieurs lignes (3). J'utilise un tableau pour stocker initialement toutes mes valeurs de ligne. Chaque valeur de ligne est une liste séparée par des virgules, entourée de parenthèses et stockée dans le tableau,

rows = [
    "(CDB_LatLng(10, 10), 1.0)",
    "(CDB_LatLng(20, 12), 1.4)",
    "(CDB_LatLng(30, 14), 1.2)"
]

insert = "INSERT INTO my_table_name (the_geom, measure) (VALUES %s)" % ','.join(rows)

En utilisant cela, j'ai encapsulé les 3 lignes dans une seule httpdemande. Il fonctionne plus rapidement tout autour et est fortement recommandé. D'après une expérience personnelle, 100-250 lignes à la fois fonctionnent très bien.

andrewxhill
la source
1
Le commentaire de @ mapbaker ci-dessous est également vrai! j'aurais pu échanger un tas de ceci pour la bibliothèque cartodb, je pensais juste que j'irais brut dans ce cas
andrewxhill
2

Voici un exemple de script que j'ai écrit il y a quelque temps. Il implémente essentiellement ce que andrewxhill a écrit ci-dessus, mais utilise la bibliothèque "requests" au lieu de urllib.

Il regroupe les insertions pour en faire 1000 à la fois, puis utilise l'API pour effectuer les insertions.

lasbbox2cartodb.py

Le script parcourt un ensemble de fichiers Lidar dans des sous-répertoires et insère les cadres de délimitation des fichiers lidar dans CartoDB.

stuporglue
la source