본문 바로가기
IT 프로그래밍 관련/Python MySQL connection

Python에서 MySQL connection , insert 하기

by 지나는행인 2021. 3. 18.
728x90

python 에서 라이브러리 설치까지 끝냈다면, python과 mysql을 커넥션 해야한다.

 

먼저, mysql에서의 작업이 필요하다.

 

이미 관리자 계정이 있지만, 그것을 사용하지 않고, 데이터베이스 하나를 사용할 수 있도록 계정을 다시 만들겠다.

 

업무에 임할때 관리자 계정이 아닌, 위의 형태로 계정을 실무자가 받아서 하게끔 되어있다.

 

계정만드는 것은 현재 사용하고 있는 MySQL workbench에서 한다.

 

1
 create user 'streamlit'@'%' identified by '1234' ;
cs

 

create user '만들계정명'@'%' identified by '패스워드' ;  

 

이런 형태를 띈다.   난  streamlit을 이용하기 위함이기 때문에 streamlit으로 만들었다.

 

그런 후에는 이 계정에 권한을 설정해야한다.

 

관리자는 모든 데이터베이스 , 테이블 다 관여를 할 수 있지만, 이렇게 만드는 계정은 

 

권한을 다 줄 수 도 있지만, 제한적으로 주는 것이 가능하다.

 

1
 grant all on yhdb.* to 'streamlit'@'%' ;
cs

 

내가 사용할 데이터베이스의 이름은  yhdb 이다. 

 

이 yhdb를 streamlit 계정이 사용할 수 있도록 할 것이기 때문에 위의 형태로 입력한다.

 

이제 파이썬에서 yhdb 데이터베이스로 커넥션을 해보겠다.

 

아래는 visual studio code 에서 작성하였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import mysql.connector
from mysql.connector import Error    
 
# 커넥션 과정에서 에러가 발생하는지 보기 위하여 try except 를 이용한다.
 
try :
    
    # 커넥터로부터 커넥션을 받는다.
    connection = mysql.connector.connect( host = '본인host', database = '데이터베이스 이름'
user = '유저name', password = '패스워드')
 
    if connection.is_connected() :
         
        db_info = connection.get_server_info()       # 서버의 info를 받아서 print로 확인하는 과정
        print('MySQL server version : ', db_info )         
 
        # 커서를 가져온다.
        cursor = connection.cursor()   #커서로 실행을 한다.
 
 
        # 내가 실행할 sql 문을 query 변수에 담았다. 이때 values 에 들어가야 하는 
# 데이터는 %s  로 표현한다.   
        
        query = '''insert into cats4(name, age)
                                values (%s, %s);'''       
        
        record =('냐웅이'1 )           # 위의 %s 부분에 들어갈 데이터도 변수 처리해준다.
        
               
 
        # 실행한다.
 
        cursor.execute(query, record)              
        # record 부분을 변수 처리 말고 curs.execute(query, ('냐웅이', 1))도 되지만, 
# 코드 수정시 번거롭다.
        
        #commit한다.
    
        connection.commit()
        print('{}개 적용됨'.format(cursor.rowcount))   #데이터가 적용 됐는지 확인 위한 print문
 
except Error as e :
    print('db관련 에러 발생', e)        # 여기까지의 과정에서 에러가 나는지 확인한다.
 
finally :                      #위의 커넥션과 insert가 잘 이루어졌으면 , 커서와 커넥션을 종료한다.
    cursor.close()
    connection.close()
    print('MySQL 커넥션 종료'
cs

위의 코드내용이 python 과 mysql을 커넥션하고 데이터를 insert 하는코드이다.

 

mysql.connector.connect( host = '본인host', database = '데이터베이스 이름'
user = '유저name', password = '패스워드')

 

이 부분에서 위의 계정정보와 같이 나는 host = 호스트정보,

database = 'yhdb'

user = streamlit

password = 1234 로 설정하였다.

 

그 후 순서로 보자면, 커넥션 되었을 경우!!

 

위의 코드가 실행된다.

 

위는 하나의 데이터를 insert 한다. 그렇다면 여러개의 데이터는 insert할 수 없을까.  할 수 있다.

 

아래는 여러개의 데이터를 insert 하는 코드이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import mysql.connector
from mysql.connector import Error    
 
# 커넥션 과정에서 에러가 발생하는지 보기 위하여 try except 를 이용한다.
 
try :
    
    # 커넥터로부터 커넥션을 받는다.
    connection = mysql.connector.connect( host = '본인host', database = '데이터베이스 이름'
                                          user = '유저name', password = '패스워드')
 
    if connection.is_connected() :
         
        db_info = connection.get_server_info()       # 서버의 info를 받아서 print로 확인하는 과정
        print('MySQL server version : ', db_info )         
 
        # 커서를 가져온다.
        cursor = connection.cursor()   #커서로 실행을 한다.
 
 
        # 내가 실행할 sql 문을 query 변수에 담았다. 이때 values 에 들어가야 하는 
        # 데이터는 %s  로 표현한다.    
        
        query = '''insert into cats4(name, age)
                                values (%s, %s);'''       
        
        record =[ ('냐웅이'1 ), ('고양이'3), ('살쾡이'5) ] 
# 위의 %s 부분에 들어갈 데이터도 변수 처리해준다.
        #여러개의 데이터는 리스트로 담아준다. 
               
 
        # 실행한다.
 
        cursor.executemany(query, record)  #execute가 아닌, executemany 로 사용한다.              
        # record 부분을 변수 처리 말고 curs.execute(query, ('냐웅이', 1))도 되지만, 
        # 코드 수정시 번거롭다.
        
        #commit한다.
    
        connection.commit()
        print('{}개 적용됨'.format(cursor.rowcount))   #데이터가 적용 됐는지 확인 위한 print문
 
except Error as e :
    print('db관련 에러 발생', e)        # 여기까지의 과정에서 에러가 나는지 확인한다.
 
finally :                      #위의 커넥션과 insert가 잘 이루어졌으면 , 커서와 커넥션을 종료한다.
    cursor.close()
    connection.close()
    print('MySQL 커넥션 종료'
 
cs
 
 
 

위의 코드에서 두 군데를 수정하였다.

 

record 변수에 데이터 정보가 들어가는데 기존에 튜플형식으로 하나의 데이터를 넣었다면,  

 

여러개의 튜플을 리스트로 묶어주고 변수에 넣는다.

 

그리고 이 변수를 실행한다.

 

실행할때 하나의 데이터 실행은 cursor.execute를 사용하였지만,

 

여러개는 cursor.executemany 로 사용한다.

 

위의 코드가 정상적으로 작동을 한다면,

 

streamlit에 활용할때는 ,

 

main()함수 안에 넣어 활용한다!

댓글