使用原始psycopg2连接将Geodataframe写入PostGIS数据库,“ ValueError:geom(geometry(MULTIPOLYGON,32637))不是字符串”

时间:2018-12-06 08:31:12

标签: python sqlalchemy psycopg2 geopandas

我不确定这是否确实可行,我将从中获得一些二手经验。

我有一个大型应用程序,它是使用PostGIS数据库上的原始psycopg2连接游标构建的,现在我正在对其进行调整以插入一些GeoPandas数据框。

最初,我只是通过启动一个新引擎并像这样导入数据来做到这一点:

from sqlalchemy import create_engine
from geoalchemy2 import Geometry, WKTElement

# Get features from GeoJSON and make geom column
gdf = gpd.GeoDataFrame.from_features(res_json['features'])
gdf['geom'] = gdf['geometry'].apply(lambda x: WKTElement(x.wkt, srid=CONFIG["SRID"]))
gdf.drop('geometry', 1, inplace=True)

# Create engine and import into database
engine = create_engine('postgresql://{0}:{1}@{2}:{3}/{4}'.format(dbuser, dbpass, dbhost, dbport, dbname), echo=False)
gdf.to_sql(tbl, engine, if_exists=if_exists, index=False, schema=schema, dtype={'geom': Geometry('MULTIPOLYGON', srid=CONFIG["SRID"])})

但是当我有一个psycopg2游标控制其他所有内容时,我不喜欢打开新连接,这似乎很草率。有人告诉我我可以实际使用游标的连接本身来代替引擎,因此我尝试了以下方法:

from sqlalchemy import create_engine

# Get features from GeoJSON and make geom column
gdf = gpd.GeoDataFrame.from_features(res_json['features'])
gdf['geom'] = gdf['geometry'].apply(lambda x: WKTElement(x.wkt, srid=CONFIG["SRID"]))
gdf.drop('geometry', 1, inplace=True)

# Get source connection from cursor and import to database
engine = cur.connection
gdf.to_sql(tbl, engine, if_exists=if_exists, index=False, schema=schema, dtype={'geom': Geometry('MULTIPOLYGON', srid=CONFIG["SRID"])})

但这会返回错误:

ValueError: geom (geometry(MULTIPOLYGON,32637)) not a string

我不确定为什么会出现这个问题,create_engine()来自sqlalchemy,而不是geoalchemy,所以我不知道为什么它能够处理几何列,而这种新方法却不行。

0 个答案:

没有答案