Python добавляет панд к postgresql. датафрейм имеет разные столбцы - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь загрузить несколько фреймов данных panda в базу данных postgresql. они немного отличаются по количеству столбцов, и это выдает ошибку. Знаете ли вы обходной путь?

См. Мой код:

import geopandas as gp
from sqlalchemy import *
from geoalchemy2 import Geometry, WKTElement
import psycopg2

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)
    gdf1.to_sql('{}'.format(tablename), engine, if_exists='append', index=False,dtype={'geom': Geometry(geometry_type=geometrytype, srid=25833)})

ошибка:

psycopg2.errors.UndefinedColumn: column "example" of relation "tablename" does not exist

Я обрабатываю геоджсон и загружаю его с геопандами вместонам с пандами нужно выполнить несколько гео-операций, прежде чем я смогу их обработать. Я не думаю, что это повлияет на процесс, но я включил его на всякий случай.

1 Ответ

1 голос
/ 16 октября 2019

Вот обходной путь для этого:

Сначала используйте 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)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...