꾸준하고 즐겁게

Python에서 MySQL에 데이터 인서트하기 + insert문 제대로 사용했는데 DB에 저장이 안되는 경우 본문

Database

Python에서 MySQL에 데이터 인서트하기 + insert문 제대로 사용했는데 DB에 저장이 안되는 경우

wj9183 2021. 5. 9. 16:19
728x90

지난 글에서 일부를 바꾼 후 이어서 작성하겠다.

지난 글에 이어 다시 한 번 쓰지만, connection 가져오는 코드는 보안상의 문제로 config 파일로 따로 만들어 관리하고 사용한다.

이 글에서는 순전히 설명상의 편의를 위해 그렇게 작성되었다.

 

이번 글에서 사용할 코드는 다음과 같다.

query라는 변수에 들어갈 문자열은 진행하면서 작성해보겠다.

 

import mysql.connector
from mysql.connector import Error 

def main():
    try : 

        connection = mysql.connector.connect(
            host = 'database-1.abcedfghijklmophihi.us-east-2.rds.amazonaws.com',
            database = 'mydb',
            user = 'wj9183',
            password = 'hi1234'
        )

        if connection.is_connected() :
            cursor = connection.cursor(dictionary= True)
            
            query = """  """
                        
            cursor.execute(query)
            results = cursor.fetchall()

			print(results)

    except Error as e :
            print('디비 관련 에러 발생', e)
        
    finally :
        cursor.close()
        connection.close()
        print("MySQL 커넥션 종료")


if __name__ == '__main__':
    main()

 

 

 

 

 

 

쿼리는 워크밴치에서 작성한다.

 

첫줄에서, 해당 DB를 사용하게 했다.

테이블을 사용하려면, 사용하기 전에 그 DB를 사용하겠다고 알려줘야한다.

 

그리고 두번째 줄에서 위와 같은 테이블 하나를 가져와 화면에 띄웠다.

 

쿼리는 워크밴치에서 작성한다.

꼭 그래야하는 건 아니지만, vscode를 비롯한 다른 IDE에서 작성하기엔 유닛테스트에 불리하기 때문이다.

미리 확인해서 제대로 작동하는 걸 가져다 쓰는 게 좋다.

 

작성된 쿼리는 다음과 같다.

use mydb;

select * from cats;

 

 

 

 

 

 

쿼리를 작성하고, 테스트한다.

 

고양이의 이름과 나이가 들어있는 쿼리를 작성하고 실행한 후, 셀렉트 문으로 출력했다.

작성된 쿼리는 다음과 같다.

insert into cats (name, age) values ("정신차려 이 각박한 세상 속에서", 42);
select * from cats;

 

쿼리를 잘 작성했다는 걸 알 수 있다.

 

 

 

 

 

vscode에서 쿼리를 실행해보자.

 

편집이 번거로워 잘랐다. 이 부분만 보면 된다.

고양이 이름과 나이는 살짝 바꿔주었다.

 

정민근은 2년 전에 인근 인형뽑기 가게에서 뽑은 얘 이름이다.

 

 

 

실행했다.

에러가 발생했고, 커넥션이 종료됐다.

사실 fetchall은 저 쿼리를 실행함으로써 반환받을 값이 있는 경우에 쓰인다.

우리가 작성한 쿼리는 insert문이므로 값이 없는 게 정상이다.

 

DB에도 저장이 되지 않았다.

 

 

 

 

insert문 제대로 사용했는데 DB에 저장이 안되는 경우

이 부분 중요하다.

처음 이 과정을 배웠을 때, 이 부분에서 엄청 헤맨 적이 있다.

정말 오랫동안 헤맸다.

코드가 잘 작성됐고, 코드도 문제가 없는 것 같은데 DB에는 데이터가 저장되지 않았다.

 

commit이 빠졌기 때문이였다.

데이터베이스에 반영할 때 사용하는 함수이다.

insert문을 사용했을 때는 커서와 연결을 닫기 전에 꼭 써줘야한다.

 

------------------------------------------------------------------------------------------
		)
        if connection.is_connected() :
            cursor = connection.cursor(dictionary= True)
            query = """insert into cats (name, age) values ("정민근", 2);"""
            cursor.execute(query)
            
            connection.commit()




    except Error as e :
            print('디비 관련 에러 발생', e)
        
    finally :
        cursor.close()
        connection.close()
        print("MySQL 커넥션 종료")


if __name__ == '__main__':
    main()

쓸모없는 fetchall을 없애고, 커밋하는 함수를 넣어주고, 실행했다.

 

 

 

 

 

 

에러 문구가 뜨지 않았다.

 

 

 

 

성공적으로 insert문이 실행되었고, commit이 됐다.

가장 마지막에 민근이가 추가된 걸 볼 수 있다.

민-하

728x90