190 lines
5.5 KiB
Python
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)") |