꾸준하고 즐겁게

전용 DB 유저 생성하고, Python에서 MySQL 커넥션 해보기 본문

Database

전용 DB 유저 생성하고, Python에서 MySQL 커넥션 해보기

wj9183 2021. 5. 9. 02:05
728x90

DB는 항상 원통형으로 그려진다.

 

전용 DB 유저 생성하기

 

create user 'wj9183' @'%' identified by 'hi1234';
grant all on mydb.* to 'wj9183' @'%';

 

먼저, 모든 권한을 가진 admin 계정으로 Workbench에 접속한다.

username과 password를 정해, 첫 쿼리문과 같이 입력하고 실행해준다.

작성자는 username은 wj9183으로 했고, password는 hi1234로 했다.

그리고 두 번째 쿼리에서, mydb이라는 schema에 한해 모든 걸 할 수 있는 권한을 wj9183에게 준 것이다.

 

이렇게 특정 db만 사용할 수 있는 계정을 만들어서 통신하게 할 수 있다.

어떤 조작만 할 수 있는지 다 정해줄 수 있다.

데이터 인서트를 못하게 한다거나 셀렉트만 쓰게 한다거나하는 게 가능한 것이다.

 

 

 

 

 

 

Python에서 MySQL 커넥션하기

예시를 통째로 가져왔다.

설명은 코드블럭에서 해보겠다.

 

 

#앱으로 실행해보기 위해 사용했던 streamlit 라이브러리이다.
import streamlit as st

#mysql 라이브러리 import이다.
import mysql.connector
from mysql.connector import Error 


#메인함수이다.
def main():
	#트라이캐치문을 사용했다.
    try :
    
    	#커넥션을 가져온다. 원래는 이 부분 코드를 모두가 볼 수 있는 곳에 삽입하면 안된다.
        connection = mysql.connector.connect(
            host = '', #데이터베이스의 endpoint가 필요하다. 밑에서 이미지와 관련 링크를 첨부할 것이다.
            database = 'mydb', #작업할 schema의 이름을 써준다.
            user = 'wj9183', #위에서 등록한 계정의 username을 써준다.
            password = 'hi1234' #위에서 등록한 계정의 password를 써준다.
        )

		#커넥션을 제대로 가져왔을 경우 이 부분이 실행된다.
        if connection.is_connected() :
        
        	#커서를 가져온다.
            cursor = connection.cursor(dictionary= True)
            
            #실행할 쿼리문을 작성하면,
            query = """ select *
                        from books limit 5; """
                        
            #이 부분에서 쿼리를 실행해준다.
            #쿼리를 여러개 실행할 땐, executemany라는 함수를 사용할 수 있다.
            cursor.execute(query)
            
            #그리고 쿼리 실행의 결과를 가져와, results라는 변수에 저장한 것이다.
            #fetchall일 경우 결과를 모두 가져오고, fetchone일 경우 하나만 가져온다.
            results = cursor.fetchall()

			#이 부분은 스트림릿 앱 화면에 보여주기 위해 작성된 부분이다.
            #크게 신경쓰지 않아도 된다. 사용 예를 보여주기 위함이다.
            #그냥 print로 results만 찍어봐도 터미널에 결과가 찍힌다.
            for row in results :
                st.write(row)
                book_id_list.append( row['book_id'] )

	#DB 관련 에러가 발생할 시, 터미널에 에러 문구를 출력하게 했다.
    except Error as e :
            print('디비 관련 에러 발생', e)
    
    #마지막엔 커서와 커넥션을 닫아준다.
    #닫아주지 않을 경우 뒤에서 또 커서와 커넥션을 사용하게 됐을 때 제대로 작동하지 않을 수 있다.
    finally :
        cursor.close()
        connection.close()
        print("MySQL 커넥션 종료")


if __name__ == '__main__':
    main()

원래는 보안의 문제로, 커넥션 가져오는 코드를 저렇게 모두가 볼 수 있는 곳에 삽입하지 않는다.

따로 config 파일로 나눠서 관리하지만, 설명 편의상 한꺼번에 작성했다. 

그냥 함수나 클래스를 만드는 것이다.

어렵지 않으니 굳이 설명은 하지 않겠다.

 

코드블럭에서 빼먹은 host에는, 아래 이미지의 카피라고 써있는 엔드포인트 부분을 복사해서 넣으면 된다.

먼저 aws에 접속한다.

 

이전 글에서 가져왔는데 화질구지가 됐다.

귀찮으면 다른 방법도 있으니 아래를 보면 된다.

 

 

 

 

 

 

 

여기까지 된다면, 엔드포인트는 사실 여기서 가져와도 된다.

 

MySQL Workbench를 사용한다면 설치하고 환경 설정할 때,

저 본의아니게 파랗게 빛나는 부분에도 이미 엔드포인트를 입력한 적이 있을 것이다.

당연히 그거 복사해와도 된다.

728x90