Вот обходной путь для этого:
Сначала используйте SQL-запрос в вашем коде Python, чтобы получить столбцы, которые уже существуют в вашей таблице. (Я пишу запрос для PostGreSql, измените его в соответствии с вашей базой данных)
cur.execute('SELECT * FROM public."%s" LIMIT 0' % tablename)
colnames = [desc[0] for desc in cur.description]
, где 'cur' - ваш курсор, а 'tablename' - имя вашей таблицы.
Затем получите имена ваших столбцов в текущем фрейме данных.
colsnow = list(gdf1.columns)
Если у вашего фрейма данных есть новые столбцы, добавьте эти столбцы в таблицу, а затем добавьте ваш фрейм данных в таблицу.
setdiff = list(set(colsnow).difference(set(colnames)))
if len(setdiff)!=0:
for i in range(len(setdiff)):
cur.execute('ALTER TABLE public."%s" ADD COLUMN "%s" text' % (tablename, str(setdiff[i])))
con.commit()
'con' здесь ваш объект соединения psycopg2.
Так что ваш код должен выглядеть примерно так:
import geopandas as gp
from sqlalchemy import *
from geoalchemy2 import Geometry, WKTElement
import psycopg2
cur.execute('SELECT * FROM public."%s" LIMIT 0' % tablename)
colnames = [desc[0] for desc in cur.description]
for tablename in fileslist:
gdf1=gp.read_file("name.geojson")
gdf1['geom'] = gdf1['geometry'].apply(lambda x: WKTElement(x.wkt, srid=25833))
gdf1.drop('geometry', 1, inplace=True)
colsnow = list(gdf1.columns)
setdiff = list(set(colsnow).difference(set(colnames)))
if len(setdiff)!=0:
for i in range(len(setdiff)):
cur.execute('ALTER TABLE public."%s" ADD COLUMN "%s" text' % (tablename, str(setdiff[i])))
con.commit()
gdf1.to_sql('{}'.format(tablename), engine, if_exists='append', index=False,dtype={'geom': Geometry(geometry_type=geometrytype, srid=25833)})