Вставить Pandas фрейм данных в Postgres - PullRequest
0 голосов
/ 16 июня 2020

SQLSERVER -> Python (Аналитика) df -> POSTGRESSQL INSERT (ЕЖЕДНЕВНОЕ РАСПИСАНИЕ)

Postgres 1. Фактическая таблица - «ДРАГОЦЕННОСТИ» 2. Таблица температур - «Температура»

Я использую python для запроса SQL сервера, после подготовки данных pandas df необходимо вставить данные в PostgreSQL.

Я создал временную таблицу, чтобы избежать ошибок дублирования при вставке в PostgreSQL фактическую таблицу с помощью запроса python.

Я новичок в PostgreSQL и SQL. Хотите узнать, есть ли лучший способ

import io
import pyodbc
import psycopg2 
import pandas as pd
from sqlalchemy import create_engine
sql_conn = pyodbc.connect('DRIVER={SQL Server};SERVER=IOT-BODY1-PROD\IOT_STAGE;PORT=1433;UID=***;PWD=****;')
engine = create_engine('postgresql+psycopg2://postgres:postgres@IOT:5432/Energy')
conn = engine.raw_connection()
cur = conn.cursor()

df.head(0).to_sql('GEMS', engine, if_exists='append',index=False) #-Actual Table
df.head(0).to_sql('temp', engine, if_exists='append',index=False) #Temp Table

#cols=['DATETIME','SHOP','KWH','HOUR','DATE','TIME','ZCDAY','UID','SHIFT','WERKS']
if len(df) > 0:
    df_columns = list(df)
    # create (col1,col2,...)
    columns = ",".join(df_columns)

for i in columns:

    output = io.StringIO()
    df.to_csv(output, sep='\t', header=False, index=False)
    output.seek(0)
    contents = output.getvalue()
    cur.copy_from(output, 'temp',null="")
    cur.execute("""Insert into public."""+'"{}"'.format(i)+""" select * From public.temp ON CONFLICT DO NOTHING;""");
    cur.execute("""Delete FROM public.temp;""");
    conn.commit()

Ошибка:

---> 13     cur.copy_from(output, 'temp',null="")
     14     cur.execute("""Insert into public."""+'"{}"'.format(i)+""" select * From public.temp ON CONFLICT DO NOTHING;""");
     15     cur.execute("""Delete FROM public.temp;""");

InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

Как решить эту ошибку?

...