使用python函数输出来更新各个postgresql行

时间:2016-04-17 05:06:57

标签: python postgresql psycopg2

我正在开发一个项目,该项目要求postgresql中的列由Mapbox地理编码api更新,以将地址转换为lon,lat坐标。我创建了一个FOR循环来读取每行的地址。我希望将创建的唯一lon,lat坐标保存到"坐标"柱。

然而,我写的代码更新了整个"坐标"列具有第一行的lon,lat坐标,而不是迭代和更新每一行" s"坐标"单独列。

我哪里出错了?任何帮助将不胜感激。

主要代码

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

1 个答案:

答案 0 :(得分:0)

您需要在UPDATE语句中添加WHERE条件。如果没有WHERE,SQL只会认为您要更新所有坐标列。正确的WHERE条件将让它特别知道它需要修改的列中的哪个单元格。

您可能希望使用主键,因为它是唯一标识符。也许是一句话:

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

我认为你需要的行索引是row [8],但你必须在代码中确认。我希望能让它发挥作用。