我不确定这是否确实可行,我将从中获得一些二手经验。
我有一个大型应用程序,它是使用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,所以我不知道为什么它能够处理几何列,而这种新方法却不行。