首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python函数输出更新各个postgresql行

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

Stack Overflow用户
提问于 2016-04-17 05:06:56
回答 1查看 1.8K关注 0票数 2

我正在进行一个项目,该项目要求postgresql中的一个列由Mapbox地理编码api更新,以便将地址转换为lon,lat坐标。我创建了一个FOR循环,以便从每一行读取地址。然后,我想保存创建到“坐标”列中的唯一lon,lat坐标。

但是,我编写的代码用第一行的lon、lat坐标更新整个“坐标”列,而不是单独迭代和更新每一行的“坐标”列。

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

主代码

代码语言:javascript
复制
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()

地码函数

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-17 07:55:30

您需要在UPDATE语句中添加WHERE条件。如果没有位置,SQL只是认为您想要更新所有的坐标列。适当的WHERE条件会让它具体知道它需要修改列中的哪个单元格。

您可能希望使用主键,因为它是唯一的标识符。也许是一项大意如下的声明:

代码语言:javascript
复制
cur.execute("UPDATE permits SET coordinates = %s WHERE id = %s;", (help, row[index of the id column]) )

我认为您需要的行索引是row8,但是您必须在代码中确认这一点。我希望这能让它发挥作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36672896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档