2016-04-17 4 views
2

私は、アドレスをlon、lat座標に変換するMapboxジオコーディングAPIによってpostgresqlのカラムを更新する必要があるプロジェクトに取り組んでいます。私はFORループを作成して各行からアドレスを読み込みました。私はユニークなlonを保存したいと思います。lat座標を "coordinates"カラムに作成します。python関数の出力を使用して個々のpostgresqlローを更新する

しかし、私が書いたコードは、各行の「座標」列を反復して更新するのではなく、最初の行のlon、lat座標で「座標」列全体を更新します。

どこが間違っていましたか?どんな助けでも大歓迎です。

メインコード

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() 

ジオコード機能

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、三重引用符のPython文字列を使用すると、複数の行にSQLを分割できるため、人間が読みやすくなります。 –

+0

ありがとう、私はちょうどいくつかの変更を行った@WayneWerner。 –

答えて

0

あなたのUPDATE文でWHERE条件を追加する必要があります。 WHEREがなければ、SQLは単にすべての座標列を更新したいと考えています。適切なWHERE条件は、列のどのセルを変更する必要があるかを具体的に知らせる。

プライマリキーは一意の識別子であるため、使用することをお勧めします。おそらくの線に沿って声明:

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

は、私が[8]、あなたが必要とする行インデックスが行になると思いますが、あなたはあなたのコードでそれを確認する必要があります。私はそれが働くことを望む。

+0

カーソルをディクショナリとして使用する方が良いです。つまり、インデックスではなく名前で列にアクセスできます。 – Elad

+0

ああ、面白い。私はあなたがそれを行うことができるかどうかはわかりませんでしたですから、次のようなものです: 'row [id]'? – coralvanda

+0

ありがとうございます!これはうまくいった! –

関連する問題