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
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. –
Danke, ich habe gerade einige Änderungen @WayneWerner vorgenommen. –