Ada metode DataFrame.to_sql , tetapi hanya berfungsi untuk database mysql, sqlite dan oracle. Saya tidak bisa meneruskan ke metode ini koneksi postgres atau mesin sqlalchemy.
sumber
Ada metode DataFrame.to_sql , tetapi hanya berfungsi untuk database mysql, sqlite dan oracle. Saya tidak bisa meneruskan ke metode ini koneksi postgres atau mesin sqlalchemy.
Mulai dari pandas 0.14 (dirilis akhir Mei 2014), postgresql didukung. The sql
modul sekarang menggunakan sqlalchemy
untuk mendukung rasa database yang berbeda. Anda dapat mengirimkan mesin sqlalchemy untuk database postgresql (lihat dokumen ). Misalnya:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Anda benar bahwa di panda hingga versi 0.13.1 postgresql tidak didukung. Jika Anda perlu menggunakan panda versi lama, berikut adalah versi patch dari pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234 .
Saya menulis ini beberapa waktu lalu, jadi tidak dapat sepenuhnya menjamin bahwa itu selalu berhasil, tetapi dasarnya harus ada). Jika Anda meletakkan file itu di direktori kerja Anda dan mengimpornya, maka Anda harus dapat melakukannya (di mana con
ada koneksi postgresql):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine
, dapatkah saya menggunakanPostgres
koneksi yang sudah ada yang dibuat menggunakanpsycopg2.connect()
?Opsi lebih cepat:
Kode berikut akan menyalin Pandas DF Anda ke postgres DB jauh lebih cepat daripada metode df.to_sql dan Anda tidak memerlukan file csv perantara untuk menyimpan df.
Buat mesin berdasarkan spesifikasi DB Anda.
Buat tabel di postgres DB Anda yang memiliki jumlah kolom yang sama dengan Dataframe (df).
Data di DF akan dimasukkan ke dalam tabel postgres Anda.
jika Anda ingin mengganti tabel, kita dapat menggantinya dengan metode to_sql normal menggunakan header dari df kita dan kemudian memuat seluruh df yang memakan waktu besar ke dalam DB.
sumber
contents
? Haruskah ini yang tertuliscopy_from()
?contents
variabelnya, semua yang lain akan bekerja dengan baikoutput.seek(0)
?Solusi panda 0.24.0+
Di Pandas 0.24.0, fitur baru diperkenalkan yang dirancang khusus untuk penulisan cepat ke Postgres. Anda dapat mempelajarinya lebih lanjut di sini: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
sumber
method='multi'
opsi cukup cepat. Tapi ya,COPY
cara ini adalah cara tercepat saat ini.with
menulis ke dalam buffer memori. Bagian terakhirwith
adalah menggunakan pernyataan SQL dan memanfaatkan kecepatan copy_expert untuk memuat data secara massal. Apa bagian tengah yang dimulai dengancolumns =
melakukan?keys
argumen dalampsql_insert_copy
fungsi tersebut? Bagaimana cara mendapatkan kunci dan apakah kuncinya hanya nama kolom?Table 'XYZ' already exists
. Sejauh yang saya mengerti, seharusnya tidak membuat tabel, bukan?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- ini membuat tabel di database Anda.Beginilah cara saya melakukannya.
Mungkin lebih cepat karena menggunakan
execute_batch
:sumber
Untuk Python 2.7 dan Pandas 0.24.2 dan menggunakan Psycopg2
Modul Koneksi Psycopg2
Hubungkan ke database
Dengan asumsi dataframe sudah ada sebagai df
sumber