Schnelle Einfügung von Pandas -Datenframe in Postgres DB mit Psycopg2Python

Python-Programme
Anonymous
 Schnelle Einfügung von Pandas -Datenframe in Postgres DB mit Psycopg2

Post by Anonymous »

Ich versuche, einen Pandas -Datenfreame in ein PostgreSQL DB (9.1) auf die effizienteste Weise einzufügen (unter Verwendung von Python 2.7). DataFrame.to_csv (Buffer, ...) "zusammen mit" Copy_From ".

Ich habe bereits viel gefunden! Eine schnellere Lösung im Web (http://atthedots.blogspot.de/2008/08/fa ... copgs.html), den ich für die Arbeit mit Pandas angepasst habe.

Mein Code kann unten gefunden werden.

Meine Frage ist DataFrames und wenn dies viel schneller wäre. />
Dies ist mein Ansatz: < /p>

Code: Select all

import psycopg2
import connectDB # this is simply a module that returns a connection to the db
from datetime import datetime

class ReadFaker:
"""
This could be extended to include the index column optionally. Right now the index
is not inserted
"""
def __init__(self, data):
self.iter = data.itertuples()

def readline(self, size=None):
try:
line = self.iter.next()[1:]  # element 0 is the index
row = '\t'.join(x.encode('utf8') if isinstance(x, unicode) else str(x) for x in line) + '\n'
# in my case all strings in line are unicode objects.
except StopIteration:
return ''
else:
return row

read = readline

def insert(df, table, con=None, columns = None):

time1 = datetime.now()
close_con = False
if not con:
try:
con = connectDB.getCon()   ###dbLoader returns a connection with my settings
close_con = True
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
return "failed"
inserted_rows = df.shape[0]
data = ReadFaker(df)

try:
curs = con.cursor()
print 'inserting %s entries into %s ...' % (inserted_rows, table)
if columns is not None:
curs.copy_from(data, table, null='nan', columns=[col for col in columns])
else:
curs.copy_from(data, table, null='nan')
con.commit()
curs.close()
if close_con:
con.close()
except psycopg2.Error, e:
print e.pgerror
print e.pgcode
con.rollback()
if close_con:
con.close()
return "failed"

time2 = datetime.now()
print time2 - time1
return inserted_rows

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post