2014-04-16 10 views

Odpowiedz

40

Począwszy od pand 0.14 (wydany koniec maja 2014), obsługiwany jest postgresql. Moduł sql używa teraz sqlalchemy do obsługi różnych smaków bazy danych. Możesz przekazać silnik sqlalchemy dla bazy danych postgresql (patrz docs). Np .:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://scott:[email protected]:5432/mydatabase') 
df.to_sql('table_name', engine) 

Masz rację, że w pand do wersji 0.13.1 PostgreSQL nie obsługiwane. Jeśli chcesz użyć starszej wersji pandy, oto poprawiona wersja pandas.io.sql: https://gist.github.com/jorisvandenbossche/10841234.
Napisałem to jakiś czas temu, więc nie mogę w pełni zagwarantować, że zawsze działa, ale podstawa powinna tam być). Jeśli umieścisz ten plik w katalogu roboczym i zaimportować go, to powinieneś być w stanie to zrobić (gdzie con jest połączenie PostgreSQL):

import sql # the patched version (file is named sql.py) 
sql.write_frame(df, 'table_name', con, flavor='postgresql') 
+0

Czy to doprowadziło do 0.14? – Quant

+0

Tak, a także 0.15 jest już zwolniony (kandydat do wydania). Zaktualizuję odpowiedź, dziękuję za pytanie. – joris

+1

Ten wpis rozwiązał problem dla mnie: http://stackoverflow.com/questions/24189150/pandas-writing-dataframe-to-other-postgresql-schema – srodriguex

5

Szybsze opcja:

następujący kod będzie kopiować Pandas DF postgres DB znacznie szybciej niż metoda df.to_sql i nie będziesz potrzebował żadnego pośredniego pliku csv do przechowywania df. Utwórz silnik w oparciu o specyfikacje bazy danych. Utwórz tabelę w DB postgres, która ma taką samą liczbę kolumn jak DataFrame (df). Dane w DF otrzymają wstawiony w swojej tabeli postgres.

from sqlalchemy import create_engine 
import psycopg2 
import io 

engine=create_engine('postgresql+psycopg2://username:[email protected]:port/database') 
conn=engine.raw_connection() 
cur = conn.cursor() 
output = io.StringIO() 
df.to_csv(output, sep='\t', header=False, index=False) 
output.seek(0) 
contents = output.getvalue() 
cur.copy_from(output, ‘table_name’, null="") #null values become '' 
conn.commit() 
Powiązane problemy