본문 바로가기
프로그래밍/Python

[PostgreSQL / Python / DB] Python Dataframe을 PostgreSQL로 전송,수정,삭제,생성하기(전처리 + 쿼리문)

by Mr.noobiest 2024. 2. 6.

PostgreSQL

PostgreSQL이란?


The PostgreSQL Global Development Group에서 개발된 오픈 소스 ORDBMS며, 1996년도에 발표되어 무료이면서도 강력한 성능을 통해 사랑받는 DB다.

2024-02-06부 DB 랭킹

 

MySQL과 사용법이 거의 동일하여 기존 사용자도 많이 옮겨타고 있는 추세이다, 이번엔 Python Dataframe으로 전처리를 하고나서, 해당 데이터를 PostgreSQL에 바로 Python코드를 사용해서 적재하거나 기존 데이터를 수정하는 방법을 사용할 것이다.

 

 


 

 

설치

pip install psycopg2-binary

위 pip명령어를 사용하여 라이브러리를 다운받으면 된다,
만일 라이브러리 다운로드가 안될경우 아래 명령어를 command창에서 실행해보시길발바니다.

python3 -m pip install psycopg2-binary
또는
python -m pip install psycopg2-binary


pip는 내부 또는 외부 명령~~~ 이런 에러가 발생하면 아래 게시글 참조바랍니다.

 

[Python / pip]'pip'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다

Python 설치 이후, pip 명령어가 안먹힐때 Python을 설치하고 나서 잘깔렸는지 python을 cmd/terminal에 쳤을때는 잘나오는데, 라이브러리 설치를 위해서 pip를 쳤을때는 아래 에러가 발생하는 경우가 있습

mrnoobiest.tistory.com

 

 


 

 

Python코드로 전송하기(+쿼리문 실행하기)


1) DB에서 Table 데이터 가져와서 Dataframe으로 만들기(추출)

 

import psycopg2


DB_Name='' //Databasem이름
User_Name='' //DB에 접속할 유저명
Password='' //User_Name의 비밀번호
Table_Name='' //DB에서 조회할 Table이름

Host_IP='' //접속할 DB의 접속가능한 IP(만일 본인 PC에 설치된 DB라면 127.0.0.1를 사용하면 된다.)
Port_Num= //기본 포트번호는 5432이지만, 다른것으로 변경했다면 변경한 값을 입력해야 한다.



with  psycopg2.connect(dbname=DB_Name, user=User_Name, password=Password, host=Host_IP, port=Port_Num) as conn:
    with conn.cursor() as cur:
        cur.execute("SELECT * FROM {}".format(Table_Name))

        # 결과 가져오기
        data = cur.fetchall()

        # 컬럼 이름 가져오기
        columns = [desc[0] for desc in cur.description]

        # DataFrame 생성
        df = pd.DataFrame(data, columns=columns)

 

이렇게 가져온 Dataframe을 사용해서 원하는 전처리를 진행하면 된다.

 

 


 

 

2) DB에서 테이블 삭제하기

 

import psycopg2
Table_Name='' //DB에서 삭제할 Table이름


with  psycopg2.connect(dbname=DB_Name, user=User_Name, password=Password, host=Host_IP, port=Port_Num) as conn:
    with conn.cursor() as cur:
        cur.execute(f"DROP TABLE IF EXISTS {}".format(Table_Name))

 

 


 

 

3) DB에서 테이블 생성하기(Create)

 

import psycopg2

Table_Name='' //DB에 생성할 Table이름


with  psycopg2.connect(dbname=DB_Name, user=User_Name, password=Password, host=Host_IP, port=Port_Num) as conn:
    with conn.cursor() as cur:
        create_table_query = ''' CREATE TABLE IF NOT EXISTS {} ( {} ) '''.format(Table_Name,',\n '.join(['{} {}'.format(col, 'TIMESTAMP' if dtype == 'datetime64[ns]' else 'INTEGER' if dtype == 'int64' else 'TEXT' if dtype == 'object' else 'REAL' if dtype == 'float64' else dtype) for col, dtype in zip(df_modified.columns, df_modified.dtypes)]))

        cur.execute(create_table_query)
        conn.commit()
        
        
//( {} )의 경우 Dataframe의 dtype과 PostgreSQL에서 사용하는 dtype이 달라 적절한 dtype으로 변환하는 코드다.)

 


 

 

4) DB에서 Dataframe 데이터 추가하기(Insert)


아래 코드를 사용하면 별도의 전처리 없이 dataframe을 그대로 PostgreSQL에 업로드가능하다.

import psycopg2


Table_Name=''
df //업로드할 Dataframe


with  psycopg2.connect(dbname=DB_Name, user=User_Name, password=Password, host=Host_IP, port=Port_Num) as conn:
    with conn.cursor() as cur:
    
        # 데이터 업로드
        for index, row in df.iterrows():
            cur.execute("INSERT INTO {} ({}) VALUES ({})".format(Table_Name,
                ', '.join(df.columns),
                ', '.join(['%s' for _ in range(len(df.columns))])
            ), tuple(row))

        conn.commit()

 

 

위 코드들에 관하여 질문이 있을경우 댓글로 작성해주시기 바랍니다.

 

 

 

끝.

728x90
반응형