[GPDB, Postgres] Python DataFrame을 Postgresql, Greenplum DB에 Copy 해서 넣는 방법
Greenplum and PostgreSQL Database 2019. 7. 17. 00:07이번 포스팅에서는 Python pandas의 DataFrame을 Postgresql, Greenplum DB에 Copy 해서 집어넣는 방법을 소개하겠습니다.
먼저 간단한 예제 pandas DataFrame을 만들어보겠습니다.
import numpy as np import pandas as pd # make a DataFrame school = pd.DataFrame({'region': ['gangnam', 'secho', 'bundang', 'mokdong'], 'student_cnt': [100, 120, 150, 90], 'math_score': [91, 95, 92, 93]}, columns=['region', 'student_cnt', 'math_score']) school Out[02]: region student_cnt math_score 0 gangnam 100 91 1 secho 120 95 2 bundang 150 92 3 mokdong 90 93 |
이제 school 이라는 pandas DataFrame을 아래의 순서대로 DB에 Copy해서 넣어보겠습니다.
(1) DataFrame을 CSV 파일로 내보내기 (export a DataFrame to CSV file)
(2) Postgresql, Greenplum DB에 연결하고 Table 만들기
(3) Postgresql, Greenplum DB의 Table에 CSV file을 Copy해서 집어넣기
(1) DataFrame을 CSV 파일로 내보내기 (export a DataFrame to CSV file) |
pandas의 to_csv() 메소드를 이용하였으며, index와 header 옵션은 False로 설정해서 CSV 파일에는 포함시키지 않도록 하겠습니다.
school.to_csv('C:/Users/admin/Documents/data/school.csv', sep=",", na_rep="NaN", index=False, header=False)
|
(2) Postgresql, Greenplum DB에 연결하고 Table 만들기 |
psycopg2 라이브러리를 이용해서 Postgresql, Greenplum DB에 연결해보겠습니다. 아래의 connect() 에는 본인의 DB 설정 정보를 바꾸어서 입력해주면 됩니다.
# Postgresql DB connect using psycopg2 from psycopg2 import connect conn = connect(host='localhost', # set yours port=5432, database='postgres', user='postgres', password='postgres') cur = conn.cursor() # Create a table at Postgresql public schema with school name cur.execute(""" DROP TABLE IF EXISTS school; CREATE TABLE school ( region varchar(100), student_cnt numeric, math_score numeric ) """) conn.commit()
|
(3) Postgresql, Greenplum DB의 Table에 CSV file을 Copy해서 집어넣기 |
with open() 으로 로컬에 저장해놓은 school.csv 파일을 읽고, cursor.copy_expert() 를 이용하여 "COPY school FROM STDIN DELIMITER ',' CSV;" 쿼리문을 실행시켜서 CSV 파일을 Table 에 copy 해주겠습니다.
query = """ COPY school FROM STDIN DELIMITER ',' CSV; """ with open('C:/Users/admin/Documents/data/school.csv', 'r') as f: cur.copy_expert(query, f)
conn.commit() # close connection conn.close()
|
PGAdmin 에 들어가서 school 테이블을 조회해보니 아래처럼 데이터가 잘 copy 되서 들어가 있네요.
Python에서 DB connect해서 데이터 조회하고 DataFrame으로 만들어서 한번 더 확인을 해보았습니다. 아래와 같이 데이터가 Postgresql DB의 school table에 잘 들어가 있음을 확인할 수 있습니다.
# check cur.execute("SELECT * FROM school;") school_df = cur.fetchall() school_df Out[39]: [('gangnam', Decimal('100'), Decimal('91')), ('secho', Decimal('120'), Decimal('95')), ('bundang', Decimal('150'), Decimal('92')), ('mokdong', Decimal('90'), Decimal('93'))] |
많은 도움이 되었기를 바랍니다.