使用 python 函数输出更新单个 postgresql 行
Using python function output to update individual postgresql rows
我正在开展一个项目,该项目需要通过 Mapbox 地理编码 api 更新 postgresql 中的一列,以将地址转换为经纬度坐标。我创建了一个 FOR 循环来读取每一行的地址。然后我想将创建的唯一经纬度坐标保存到 "coordinates" 列中。
但是,我编写的代码使用第一行的经纬度坐标更新整个 "coordinates" 列,而不是单独迭代和更新每一行的 "coordinates" 列。
我哪里做错了?任何帮助将不胜感激。
主要代码
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
您需要在 UPDATE 语句中添加 WHERE 条件。如果没有 WHERE,SQL 只是认为您想要更新所有坐标列。适当的 WHERE 条件将让它明确知道它需要修改列中的哪个单元格。
您可能需要使用主键,因为它是唯一标识符。也许是这样的声明:
cur.execute("UPDATE permits SET coordinates = %s WHERE id = %s;", (help, row[index of the id column]) )
我认为您需要的行索引是行[8],但您必须在代码中确认这一点。我希望它能正常工作。
我正在开展一个项目,该项目需要通过 Mapbox 地理编码 api 更新 postgresql 中的一列,以将地址转换为经纬度坐标。我创建了一个 FOR 循环来读取每一行的地址。然后我想将创建的唯一经纬度坐标保存到 "coordinates" 列中。
但是,我编写的代码使用第一行的经纬度坐标更新整个 "coordinates" 列,而不是单独迭代和更新每一行的 "coordinates" 列。
我哪里做错了?任何帮助将不胜感激。
主要代码
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
您需要在 UPDATE 语句中添加 WHERE 条件。如果没有 WHERE,SQL 只是认为您想要更新所有坐标列。适当的 WHERE 条件将让它明确知道它需要修改列中的哪个单元格。
您可能需要使用主键,因为它是唯一标识符。也许是这样的声明:
cur.execute("UPDATE permits SET coordinates = %s WHERE id = %s;", (help, row[index of the id column]) )
我认为您需要的行索引是行[8],但您必须在代码中确认这一点。我希望它能正常工作。