【问题标题】:Using python function output to update individual postgresql rows使用 python 函数输出更新单个 postgresql 行
【发布时间】:2016-04-17 05:06:56
【问题描述】:

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

但是,我编写的代码使用第一行的 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

【问题讨论】:

  • FWIW,三重引用 Python 字符串意味着您可以将 SQL 拆分为多行,从而更易于人类阅读。
  • 谢谢,我刚刚做了一些更改@WayneWerner。

标签: python postgresql psycopg2


【解决方案1】:

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

您可能希望使用主键,因为它是唯一标识符。也许是这样的声明:

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

我认为您需要的行索引是 row[8],但您必须在代码中确认这一点。我希望它能正常工作。

【讨论】:

  • 最好将游标用作字典,这样您就可以通过名称而不是索引来访问列。
  • 哦,有趣。我不知道你能做到这一点。所以,像这样:row[id]?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多