Istnieje metoda DataFrame.to_sql , ale działa ona tylko dla baz danych mysql, sqlite i oracle. Nie mogę przejść do tej metody połączenia postgres lub silnika sqlalchemy.
źródło
Istnieje metoda DataFrame.to_sql , ale działa ona tylko dla baz danych mysql, sqlite i oracle. Nie mogę przejść do tej metody połączenia postgres lub silnika sqlalchemy.
Począwszy od pandy 0.14 (wydanej pod koniec maja 2014), obsługiwany jest postgresql. sql
Moduł używa teraz sqlalchemy
wspierać różne smaki bazy danych. Możesz przekazać silnik sqlalchemy dla bazy danych postgresql (zobacz dokumentację ). Na przykład:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Masz rację, że w pandach do wersji 0.13.1 postgresql nie był obsługiwany. Jeśli musisz użyć starszej wersji pand, 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 zaimportujesz go, 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')
Sqlalchemy engine
, czy mogę użyć istniejącegoPostgres
połączenia utworzonego za pomocąpsycopg2.connect()
?Szybsza opcja:
Poniższy kod skopiuje twój Pandas DF do 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 na podstawie specyfikacji bazy danych.
Utwórz tabelę w swojej bazie danych postgres, która ma taką samą liczbę kolumn jak Dataframe (df).
Dane w DF zostaną wstawione do Twojej tabeli postgres.
jeśli chcesz zamienić tabelę, możemy zastąpić ją normalną metodą to_sql, używając nagłówków z naszego df, a następnie załadować cały czasochłonny plik df do DB.
źródło
contents
? Czy to powinien być ten, w którym jest napisanecopy_from()
?contents
zmienną, wszystko inne powinno działać dobrzeoutput.seek(0)
?Rozwiązanie Pandas 0.24.0+
W Pandas 0.24.0 wprowadzono nową funkcję zaprojektowaną specjalnie do szybkiego zapisu do Postgres. Możesz dowiedzieć się więcej na ten temat tutaj: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
źródło
method='multi'
opcja dodawania jest wystarczająco szybka. Ale tak, taCOPY
metoda jest teraz najszybsza.with
znaku to zapis do bufora pamięci. Ostatnią częściąwith
jest użycie instrukcji SQL i wykorzystanie szybkości copy_expert do masowego ładowania danych. Jaka jest środkowa część, od której zaczyna sięcolumns =
robienie?keys
argumenty wpsql_insert_copy
funkcji? W jaki sposób uzyskuje klucze i czy klucze to tylko nazwy kolumn?Table 'XYZ' already exists
. O ile rozumiem, nie powinien tworzyć tabeli, prawda?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- to tworzy tabelę w twojej bazie danych.Tak to zrobiłem.
Może być szybszy, ponieważ używa
execute_batch
:źródło
Dla Pythona 2.7 i Pandas 0.24.2 oraz przy użyciu Psycopg2
Moduł połączeniowy Psycopg2
Połącz się z bazą danych
Zakładając, że dataframe jest już obecna jako df
źródło