Files
utilities/work/recovery-ui/recovery/lib/function/pgfunctions.py
T
2025-05-20 09:16:54 -04:00

190 lines
5.5 KiB
Python

import os
from io import StringIO
import numpy as np
import pandas as pd
import psycopg2
import psycopg2.extras as extras
def execute_many(conn, df, table):
"""
Using cursor.executemany() to insert the dataframe
"""
# Create a list of tupples from the dataframe values
tuples = [tuple(x) for x in df.to_numpy()]
# Comma-separated dataframe columns
cols = ','.join(list(df.columns))
# SQL quert to execute
query = "INSERT INTO %s(%s) VALUES(%%s,%%s,%%s)" % (table, cols)
cursor = conn.cursor()
try:
cursor.executemany(query, tuples)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("execute_many() done")
cursor.close()
def execute_batch(conn, table, df, page_size):
# csvdata = open(csvfile, 'r')
# newcvsfile = csvfile.replace('data', 'data_filtered')
# newcsvdata = open(newcvsfile, 'w')
# for line in csvdata:
# newline = line.replace("bytearray(b'\\xff\\xff\\xff\\x80')","").replace('"','')
# newcsvdata.write(newline.replace('""',''))
# csvdata.close()
# newcsvdata.close()
# df = pd.read_csv(newcvsfile, dtype=object, low_memory=False)
"""
Using psycopg2.extras.execute_batch() to insert the dataframe
"""
# Create a list of tupples from the dataframe values
tuples = [tuple(x) for x in df.to_numpy()]
# Comma-separated dataframe columns
cols = ','.join(list(df.columns))
data = ''
for col in df.columns:
data = data + ',%%s'
rowdata = data[1:]
dynamicquery = f"INSERT INTO %s(%s) VALUES({rowdata})"
# SQL quert to execute
query = dynamicquery % (table, cols)
cursor = conn.cursor()
try:
extras.execute_batch(cursor, query, tuples, page_size)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("execute_batch() done")
cursor.close()
def execute_values(conn, df, table):
"""
Using psycopg2.extras.execute_values() to insert the dataframe
"""
# Create a list of tupples from the dataframe values
tuples = [tuple(x) for x in df.to_numpy()]
# Comma-separated dataframe columns
cols = ','.join(list(df.columns))
# SQL quert to execute
query = "INSERT INTO %s(%s) VALUES %%s" % (table, cols)
cursor = conn.cursor()
try:
extras.execute_values(cursor, query, tuples)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("execute_values() done")
cursor.close()
def execute_mogrify(conn, df, table):
"""
Using cursor.mogrify() to build the bulk insert query
then cursor.execute() to execute the query
"""
# Create a list of tupples from the dataframe values
tuples = [tuple(x) for x in df.to_numpy()]
# Comma-separated dataframe columns
cols = ','.join(list(df.columns))
# SQL quert to execute
cursor = conn.cursor()
values = [cursor.mogrify("(%s,%s,%s)", tup).decode('utf8') for tup in tuples]
query = "INSERT INTO %s(%s) VALUES " % (table, cols) + ",".join(values)
try:
cursor.execute(query, tuples)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("execute_mogrify() done")
cursor.close()
def copy_from_file(conn, df, table):
"""
Here we are going save the dataframe on disk as
a csv file, load the csv file
and use copy_from() to copy it to the table
"""
# Save the dataframe to disk
tmp_df = "./tmp_dataframe.csv"
df.to_csv(tmp_df, index_label='id', header=False)
f = open(tmp_df, 'r')
cursor = conn.cursor()
try:
cursor.copy_from(f, table, sep=",")
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
os.remove(tmp_df)
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("copy_from_file() done")
cursor.close()
os.remove(tmp_df)
def copy_from_stringio(conn, df, table):
"""
Here we are going save the dataframe in memory
and use copy_from() to copy it to the table
"""
# save dataframe to an in memory buffer
buffer = StringIO()
df.to_csv(buffer, index_label='id', header=False)
buffer.seek(0)
cursor = conn.cursor()
try:
cursor.copy_from(buffer, table, sep=",")
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
return 1
print("copy_from_stringio() done")
cursor.close()
#----------------------------------------------------------------
# SqlAlchemy Only
#----------------------------------------------------------------
# from sqlalchemy import create_engine
# connect = "postgresql+psycopg2://%s:%s@%s:5432/%s" % (
# param_dic['user'],
# param_dic['password'],
# param_dic['host'],
# param_dic['database']
# )
# def to_alchemy(df):
# """
# Using a dummy table to test this call library
# """
# engine = create_engine(connect)
# df.to_sql(
# 'test_table',
# con=engine,
# index=False,
# if_exists='replace'
# )
# print("to_sql() done (sqlalchemy)")