Develop

Python에서 db 연동하기(mysql, mariadb)

Dork94 2019. 3. 28. 21:21

python에서 db 연동에 대한 블로그 글을 다시 작성하였습니다. 아래 링크를 참조하시면 더 좋을 것 같습니다 :) 

2020/12/14 - [Develop] - Python에서 Database 연동 및 사용 (mysql, mariadb)

 

예전에 파이썬에서 db를 사용할 일이있어서 코딩했다가, 오랜만에 다시 사용할일이 생겨 찾아봤다.

 

또 까먹을 것 같아 정리차 남겨둔다.

 

Python에서 database를 사용할 수 있는 방법은 여러가지가 있지만, 그 중에서 나는 mysql이나 mariadb를 사용하므로 이것들과 연동이 되는 라이브러리를 찾아보았다.

 

그래서 나는 pymysql을 이용할 것이다!

 

코드는 다음과 같다

import pymysql
# dbconfig.py
class MysqlController:
    def __init__(self, host, id, pw, db_name):
        self.conn = pymysql.connect(host=host, user= id, password=pw, db=db_name,charset='utf8')
        self.curs = self.conn.cursor()

    def insert_total(self,total):
        sql = 'INSERT INTO entire_nodes (count_of_nodes) VALUES (%s)'
        self.curs.execute(sql,(total,))
        self.conn.commit()


 

간단하게 설명하자면 class에서 인자값으로 host와 id, pw, 그리고 db이름을 인자로 받아 먼저 연결한다.

 

그리고 insert_total함수를 이용해 값을 넣을 수 있다.

 

이때 sql의 문자열에 %s를 넣고 execute시에 값을 인자로 넘기는 것을 볼 수 있는데, 이는 sql_injection 공격을 막기 위함이니 저렇게 적도록 하자 :)

 

그리고 위를 사용하는 코드는 다음과 같다.

 

import dbconfig
import requests
from bs4 import BeautifulSoup
from time import sleep
import re
#  main.py
url = 'https://www.ethernodes.org/network/1'
INTERBAL = 60
if __name__=='__main__':
    regex = re.compile(r'Total(.*\d)\s')
    mysql_controller = dbconfig.MysqlController('localhost','root','test123','etherstat')

    while True:
        res = requests.get(url)
        if res.status_code == 200:
            soup = BeautifulSoup(res.text, 'html.parser')
            items = soup.find_all('li')

            for item in items:
                result = regex.search(item.text)
                if result:
                    mysql_controller.insert_total(result.groups(1)[0])
                    sleep(INTERBAL)



 

위 코드는 특정 사이트에서 특정 값을 받아 데이터 베이스에 추가시키는 코드이다.

 

데이터베이스는 다음과 같이 구성되어있다.

 

테이블은 다음과같이 단순하게 구성되어있다. INT형의 변수와 timestamp 타입의 변수이며, timestamp는 아무런 값도 입력 되지 않는 경우 기본으로 현재 시간이 입력된다.
현재 테이블에 아무 데이터도 없는 것을 볼 수 있다.
프로그램 실행 후에 정상적으로 데이터가 입력된 것을 볼 수 있다. 프로그램이 계속 돌아간다면 1분마다 데이터가 쌓일 것 이다.