본문 바로가기

회사생활/Python

파이썬에서 DB 연결하기 - SQL 사용하기




파이썬에서 DB 연결하기 - SQL 사용하기




웹 크롤링한 데이터를 저장하기 위해 PostgreSQL을 설치해서 DB를 구성하고 테이블을 만들었다.


파이썬에서 DB를 연결하고 SQL문을 사용하는 방법을 포스팅하려고 한다.




-

(1) 모듈 설치하고 불러오기

(2) DB 연결하기

(3) SQL문 날리기

(4) DB 연결 끊기

-




(1) 모듈 설치하기 불러오기


파이썬에서 DB를 연결하기 위해서는 psycopg2를 사용한다. 이 모듈을 먼저 설치한다.


▼ 파이썬 모듈 설치방법은 아래 포스팅을 참고하자! ▼

2018/01/13 - [Analysis/PYTHON] - 파이썬과 파이썬 모듈 설치하기 | Install Python and Python Modules



터미널에서 아래 코드를 실행한다.

pip install psycopg2



이제 Jupyter에서 아래 코드를 실행하면 모듈이 불러와진다.

import psycopg2



(2) DB 연결하기


연결하려는 DB 정보를 확인한다. 나의 경우 PostgreSQL을 사용하고 pgAdmin을 이용해서 DB를 관리하고 있다.


DB에서 오른쪽 마우스를 클릭하여 Properties를 클릭한다.




아래와 같이 Properties에서 Connection 탭을 선택하면 DB 연결정보를 확인할 수 있다.




host = 'Host name/address'


dbname = 'Maintenance database'


user = 'username'


password = '본인이 설정한 패스워드'



이렇게 DB정보를 찾아서 아래 코드를 입력한다.

conn_string = "host='localhost' dbname ='postgres' user='postgres' password='패스워드'"
conn = psycopg2.connect(conn_string)


이제 아래 코드를 실행하면 입력한 DB 연결정보로 DB가 연결된다.

cur = conn.cursor()



(3) SQL Query 작성하기

기본적으로 파이썬에서 SQL문을 DB에 전달할 때는 아래 코드를 사용한다.
cur.execute("SQL문")


그리고 어떤 종류의 SQL문이냐에 따라 위 코드에 뒤따라 붙는 코드가 달라진다.
만약 DB를 변경하는 CREATE TABLE 또는 INTERT INTO 등의 SQL이라면 변경사항을 최종적으로 DB에 적용하게 하는 코드를 붙여준다.
conn.commit()


만약 DB에서 데이터를 가져오는 SELECT문이라면 아래 코드를 붙여준다.
result = cur.fetchall()


위 코드를 실행하면 SELECT문을 실행하여 가져온 데이터가 result에 저장된다.
간혹 cur.fetchone() 이라는 함수를 사용하기도 하는데, fetchall()은 모든 row의 데이터를 가져오고 fetchone()은 1개의 row만 가져오므로 기본적으로 fetchall()을 사용하는 것이 더 좋다.



SQL 종류별로 예시를 하나씩 작성해보자.

테이블 생성하기 | CREATE TABLE
cur.execute("CREATE TABLE news_list (nid SERIAL PRIMARY KEY, press_date DATE, ranking INTEGER, score INTEGER, press TEXT, title TEXT, link TEXT, creation_datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP);")

conn.commit()​

위 코드는 nid, press_date, ranking, score, press, title, link, creation_datetime 컬럼을 가지는 news_list 테이블을 만드는 SQL문이다.
nid 컬럼의 타입은 SERIAL PRIMARY KEY라고 되어있는데, 이는 자동으로 증가하는 PK라는 의미이므로 나중에 데이터를 Insert 할 때 굳이 값을 지정해주지 않아도 자동으로 생성된다.
-
-
creation_datetime 컬럼의 타입은 TIMESTAMP DEFAULT CURRENT_TIMESTAMP라고 되어있는데, 기본이 현재 시간인 날짜+시간의 형태로, 굳이 값을 지정해주지 않아도 데이터가 입력될 때의 현재 시간을 자동으로 입력해준다.

​테이블에 데이터 입력하기 | INSERT INTO
cur.execute("INSERT INTO news_list (press_date, ranking, score, press, title, link) VALUES (%s, %s, %s, %s, %s, %s)", (date1, ranking1, score1, press1, title1, link1))

conn.commit()


위 코드는 방금 전 만든 news_list 함수에 데이터를 넣는 SQL문이다.
date1의 날짜를 news_list의 press_date에 입력하라는 의미이다. 위에서 설명했다시피 nid와 creation_datetime은 직접 데이터를 입력하지 않더라도 자동으로 채워지기 때문에 위 SQL에서는 굳이 입력하지 않았다.

테이블에서 데이터 가져오기 | SELECT FROM
cur.execute("SELECT nid, press_date, ranking, press, link FROM news_list order by press_date, ranking;")
result = cur.fetchall()

위 코드는 news_list에서 특정 컬럼의 데이터를 가져와 result에 저장하는 SQL문이다.​


(4) DB연결 끊기

Query 작업 후 더이상 DB연결이 필요 없는 경우 아래 코드를 이용해 DB연결을 종료한다.
cur.close()
conn.close()