2014-04-16 17 views

Trả lời

40

Bắt đầu từ gấu trúc 0,14 (được phát hành cuối tháng 5 năm 2014), postgresql được hỗ trợ. Mô-đun sql hiện sử dụng sqlalchemy để hỗ trợ các hương vị cơ sở dữ liệu khác nhau. Bạn có thể chuyển một công cụ sqlalchemy cho một cơ sở dữ liệu postgresql (xem docs). Ví dụ .:

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

Bạn là chính xác rằng trong gấu trúc lên đến phiên bản 0.13.1 postgresql không được hỗ trợ. Nếu bạn cần sử dụng phiên bản cũ hơn của gấu trúc, đây là phiên bản được vá của pandas.io.sql: https://gist.github.com/jorisvandenbossche/10841234.
Tôi đã viết điều này một thời gian trước đây, vì vậy không thể hoàn toàn đảm bảo rằng nó luôn hoạt động, nhưng cơ sở nên ở đó). Nếu bạn đặt file trong thư mục làm việc của bạn và nhập nó, sau đó bạn sẽ có thể làm (nơi con là một kết nối postgresql):

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

Biến số này có thành 0,14 không? – Quant

+0

Có, và cũng 0,15 đã được phát hành (ứng cử viên phát hành). Tôi sẽ cập nhật câu trả lời, cảm ơn vì đã hỏi. – joris

+1

Bài đăng này giải quyết được vấn đề cho tôi: http://stackoverflow.com/questions/24189150/pandas-writing-dataframe-to-other-postgresql-schema – srodriguex

5

nhanh hơn tùy chọn:

mã sau sẽ sao chép của bạn Pandas DF để postgres DB nhanh hơn nhiều so với df.to_sql phương pháp và bạn sẽ không cần bất kỳ tập tin csv trung gian để lưu trữ các df. Tạo một công cụ dựa trên thông số kỹ thuật DB của bạn. Tạo một bảng trong DB postgres của bạn có số cột bằng nhau như Dataframe (df). Dữ liệu trong DF sẽ nhận được được chèn vào bảng bưu điện của bạn.

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() 
Các vấn đề liên quan