2016-04-17 5 views
2

Ich arbeite an einem Projekt, das eine Spalte in PostgreSQL benötigt, um von der Mapbox Geokodierung API aktualisiert werden, um eine Adresse in lon, lat Koordinaten zu konvertieren. Ich habe eine FOR-Schleife erstellt, um die Adresse jeder Zeile einzulesen. Ich möchte dann die einzigartigen lon, lat Koordinaten in der Spalte "Koordinaten" speichern.Verwenden von Python-Funktion Ausgabe zu aktualisieren einzelne Postgresql Zeilen

Der Code, den ich geschrieben habe, aktualisiert jedoch die gesamte Spalte "coordinates" mit den Koordinaten lon und lat der ersten Zeile, anstatt die Spalte "coordinates" jeder Zeile einzeln zu iterieren und zu aktualisieren.

Wo bin ich falsch gelaufen? Jede Hilfe würde sehr geschätzt werden.

Hauptcode

import psycopg2 
import json 
from psycopg2.extras import RealDictCursor 
import sys 
from mapbox import Geocoder 
from mapboxgeocode import getCoord 
import numpy as np 

con = None 

try: 

    con = psycopg2.connect(database='database', user='username') 
    cur = con.cursor() 
    cur.execute("DROP TABLE IF EXISTS permits") 
    cur.execute("""CREATE TABLE permits(issued_date DATE, address 
    VARCHAR(200), workdesc VARCHAR(600),permit_type VARCHAR(100), permit_sub_type 
    VARCHAR(100), anc VARCHAR(4), applicant VARCHAR(100),owner_name  
    VARCHAR(200))""") 
    cur.execute(""" COPY permits FROM '/path/to/csv/file' 
    WITH DELIMITER ',' CSV HEADER """) 
    cur.execute("""ALTER TABLE permits ADD COLUMN id SERIAL PRIMARY KEY; 
    UPDATE permits set id = DEFAULT;""") 
    cur.execute("""ALTER TABLE permits ADD COLUMN coordinates VARCHAR(80); 
    UPDATE permits SET coordinates = 4;""") 
    cur.execute("""ALTER TABLE permits ADD COLUMN city VARCHAR(80); 
    UPDATE permits SET city = 'Washington,DC'; ALTER TABLE permits ALTER  
    COLUMN city SET NOT NULL;""") 

    cur.execute("UPDATE permits SET address = address || ' ' || city;") 

    cur.execute("SELECT * FROM permits;") 

    for row in cur.fetchall(): 
     test = row[1] 
     help = getCoord(test) 
     cur.execute("UPDATE permits SET coordinates = %s;", (help,)) 
     print(test) 
     con.commit() 



except psycopg2.DatabaseError, e: 
    print 'Error %s' % e  
    sys.exit(1) 


finally: 

    if con: 
     cur.close() 
     con.commit() 
     con.close() 

Geocode Funktion

from mapbox import Geocoder 
import numpy as np 

def getCoord(address): 
    geocoder = Geocoder(access_token='xxxxxxxxxxxxxxxx') 
    response = geocoder.forward(address) 
    first = response.geojson()['features'][0] 
    row = first['geometry']['coordinates'] 
    return row 
+0

FWIW, triple-quoting Python-Strings bedeutet, dass Sie Ihre SQL auf mehrere Zeilen aufteilen können, was es für Menschen einfacher macht, zu lesen. –

+0

Danke, ich habe gerade einige Änderungen @WayneWerner vorgenommen. –

Antwort

0

Sie benötigen eine WHERE-Bedingung in Ihrer Update-Anweisung hinzuzufügen. Ohne WHERE denkt SQL einfach, dass Sie alle Koordinatenspalten aktualisieren möchten. Eine richtige WHERE-Bedingung informiert ihn speziell darüber, welche Zelle in der Spalte geändert werden muss.

Wahrscheinlich möchten Sie Ihren Primärschlüssel verwenden, da es sich um einen eindeutigen Bezeichner handelt. Vielleicht eine Erklärung im Sinne von:

cur.execute("UPDATE permits SET coordinates = %s WHERE id = %s;", (help, row[index of the id column])) 

ich denke, der Zeilenindex Sie benötigen würde die Zeile [8], aber Sie werden feststellen, dass in Ihrem Code bestätigen müssen. Ich hoffe, dass es funktioniert.

+0

Es ist besser, den Cursor als Wörterbuch zu verwenden. Auf diese Weise können Sie Spalten nach ihrem Namen und nicht nach Indizes aufrufen. – Elad

+0

Oh, interessant. Ich wusste nicht, dass du das tun kannst. Also, etwas in der Art: 'row [id]'? – coralvanda

+0

danke! das hat funktioniert! –

Verwandte Themen