Sử dụng Postgres 9.6.1, sqlachemy 1.1.4 và psycopg2 2.6.2:
-
Chuyển đổi cấu trúc dữ liệu của bạn sang từ điển. Từ Pandas nó là
import pandas from sqlalchemy import MetaData from sqlalchemy.dialects.postgresql import insert import psycopg2 # The dictionary should include all the values including index values insrt_vals = df.to_dict(orient='records')
-
Kết nối với cơ sở dữ liệu thông qua sqlalchemy. Thay vào đó, hãy thử trình điều khiển psycog2 bên dưới và hàm COPY gốc, bỏ qua tất cả việc lập chỉ mục postgres.
csv_data = os.path.realpath('test.csv') con = psycopg2.connect(database = 'db01', user = 'postgres') cur = con.cursor() cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data) con.commit()
-
Thực thi
results = engine.execute(do_nothing_stmt) # Get number of rows inserted rowcount = results.rowcount
Cảnh báo:
Phương pháp này không hoạt động với NaT
ra khỏi hộp.
Mọi thứ cùng nhau
tst_df = pd.DataFrame({'colA':['a','b','c','a','z', 'q'],
'colB': pd.date_range(end=datetime.datetime.now() , periods=6),
'colC' : ['a1','b2','c3','a4','z5', 'q6']})
insrt_vals = tst_df.to_dict(orient='records')
engine = sqlalchemy.create_engine("postgresql://user:[email protected]/postgres")
connect = engine.connect()
meta = MetaData(bind=engine)
meta.reflect(bind=engine)
table = meta.tables['tstbl']
insrt_stmnt = insert(table).values(insrt_vals)
do_nothing_stmt = insrt_stmnt.on_conflict_do_nothing(index_elements=['colA','colB'])
results = engine.execute(do_nothing_stmt)
Thay vì bước 2 và 3, hãy sử dụng psycog2
trình điều khiển với lệnh sao chép trong postgres nhanh hơn đối với các tệp lớn hơn (sắp đạt đến biểu diễn) vì nó tắt tất cả việc lập chỉ mục bảng.
csv_data = os.path.realpath('test.csv')