파이썬 - 데이터베이스 - 데이터 추가하기

2025. 1. 31. 16:38IT

데이터베이스를 만들고 데이터가 저장이 될 테이블을 만들었습니다. 이제는 테이블에 필요한 정보들을 어떻게 넣는지 살펴보도록 하겠습니다. 우리는 SQL 문장 중에서 INSERT 문을 이용하여 데이터를 저장하게 됩니다. INSERT문의 형식은 다음과 같습니다.

 

INSERT INTO 테이블명 VALUES (필드1, 필드2, … , 필드n);

 

테이블 명을 앞에 써 주고, VALUES 다음의 괄호 안에 테이블을 만들때 정의된 필드의 순서대로 ‘,’를 구분자로 하여 값들을 넣어주면 됩니다. 그리고 괄호를 닫고 마지막에 세미콜론으로 마무리를 합니다. 이와 같은 INSERT 문을 파이썬에서 어떻게 사용하는지 다음의 코드를 보면서 설명을 드리겠습니다. 

 

025_dbInsert.py

 

다시 코드를 보면서 설명을 하겠습니다만, 이번 장에서 가장 중요한 사항은 두 가지입니다. 첫번째는 INSERT문에 대한 이해이고 두번째는 SQL 명령을 내린 후에 실제로 데이터베이스에 정보를 업데이트 하기 위해서는 con.commit()을 호출하여 커서에 반영된 INSERT를 실제의 데이터베이스에 저장을 해야만 한다는 것입니다.

한줄씩 코드를 살펴보겠습니다. INSERT 문을 execute() 함수에서 사용하는 방식은 크게 두 가지가 있습니다.

 

 cur.execute("INSERT INTO CustomerCode VALUES (1, '홍길동');")

 

첫번째 방식입니다. 커서에서 execute() 함수를 이용해서 앞서 설명한대로 INSERT문으로 id와 name에 각각 1과 ‘홍길동’을 입력하고 있습니다. 하지만 이런 방법은 실제 프로그래밍에서 사용하기 어렵습니다. 왜냐하면 실제로 데이터베이스 들어갈 정보는 사용자로 부터 화면에서 입력을 받거나 또는 파일에서 불러와 데이터베이스에 저장을 하는 경우가 대부분이기 때문입니다. 우리는 이 INSERT문의 형식을 실제 데이터를 변수로 받아서 데이터베이스에 저장하는 방식을 나중에 살펴보겠습니다. 

 

 cur.execute("INSERT INTO CustomerCode VALUES (?, ?);", (2, '김갑동'))

 

두번째 방식은 VALUES 다음의 괄호에 필드의 개수 만큼 ?를 넣어줍니다. 그리고 INSERT문 다음의 괄호 안에 각각 값을 넣어주는 방식입니다. 이 방식이 실제로 많이 사용됩니다. 하지만 두 번째 괄호 안의 입력될 값들이 변수로 바뀌어 실제 프로그래밍에서는 사용이 됩니다.

 

다음의 두 예는 앞선 첫번째와 두번째가 실제로 사용되는 방식을 보여줍니다. 

 

 id = 3

 name = '김순이'

 cur.execute(f"INSERT INTO CustomerCode VALUES ({id}, '{name}');")

 

첫번째 방식이 변수를 사용하는 방법으로 변경이 되었습니다. 문자열에 f를 이용하여 변수를 사용하는 방법으로 전에 print() 함수에서 사용하는 방법을 설명드렸던 적이 있습니다. 이런 방식으로 INSERT문을 용도에 맞게 수정해서 사용할 수 있습니다. 이 방식을 세번째 방식이라고 하겠습니다.

 

 id2 = 4

 name2 = '삼순이'

 cur.execute("INSERT INTO CustomerCode VALUES (?, ?);", (id, name))

 

INSERT문을 사용하는 마지막 방식입니다. 이 코드는 두번째 방식이 변수를 사용하는 방식으로 변경이 된 것입니다. execute() 함수에서 INSERT문에 필드 값에 해당하는 부분에 ?를 사용하고, 두 번째 매개변수에서 ?와 대응하는 변수들의 이름을 넣어주는 방식입니다.

 

세번째와 네번째 방식이 실제 프로그램에서 사용할 수 있는 방식입니다. 어떤 것이 읽기 쉽게 보이시나요? 우리는 네번째 방식을 주로 사용하게 될 것입니다. 파이썬에서 sqlite를 사용하는 SQL문에서 각각의 필드 값들을 사용할 때는 네번째 방식을 사용하는 것이 일반적입니다.

 

 con.commit()

 

처음 나오는 commit() 함수입니다.

우리는 지금까지 cur 변수, 즉 커서를 이용해서 데이터베이스를 조작하는 동작들을 했습니다. 이는 커서에서만 동작을 할 뿐, 실제 데이터베이스까지 정보가 전달되는 것이 아닙니다. 따라서 커서를 가지고 데이터베이스에서 데이터를 추가, 수정, 삭제한 경우에는 반드시 commit() 함수를 통해서 커서에서 작업한 내용이 데이터베이스에 반영이 되도록 해야 합니다.

 

지금까지 입력한 내용이 제대로 데이터베이스에 들어가 있는지 확인하기 위해서 DB Browser를 이용해 확인해 보면 다음과 같이 네 개의 레코드가 들어가 있음을 볼 수 있습니다.

 

 

데이터베이스에서 필드는 id 및 name과 같이 테이블에 열 이름에 해당하는 것이며, 레코드는 몇 행인지를 이야기 합니다. 다시 얘기하면 레코드는 들어가 있는 자료의 수입니다.

 

다음은 addressBook 테이블에 정보를 INSERT하는 코드입니다. 실제로 많이 사용하는 코드의 형태이니 잘 살펴봅시다.

먼저 다음과 같이 리스트에 대해서 설명을 드리겠습니다.

 

address = ['인천시 연수동', '경기도 여주시', '서울 강서구', '부산 기장구']

 

cellNumber라는 변수에 ‘[ ]’를 이용해서 주소를 넣었습니다. 문자열이니 작은 따옴표를 이용해서 주소를 넣었고, 각 주소 사이는 콤마로 구분을 했습니다. 작은 따옴표 뿐만 아니라 큰 따옴표를 이용해도 무방합니다. 이와 같은 형태의 자료구조를 리스트라고 합니다. 컴퓨터에서 숫자는 항상 0부터 시작을 합니다. 그래서 각각의 주소를 접근할 때는 다음과 같이 사용을 할 수 있습니다. 



address[0] 인천시 연수동
address[1] 경기도 여주시
address[2] 서울 강서구
address[3] 부산 기장구



똑같은 방식으로 cellNumber를 접근할 수 있겠죠?

리스트를 이해했다면 다음 코드를 이해할 수 있습니다.

 

026_dbInsert2.py



 for i in range(1, 5, 1):

     cur.execute("INSERT INTO AddressBook VALUES (?, ?, ?);",

         (i, cellNumber[i-1], address[i-1]))

 

먼저 for 문입니다. range()를 보면 1부터 시작해서 5보다 작을 때까지 1씩 증가하면서 execute() 함수를 실행합니다. 따라서 i는 1, 2, 3, 4까지 변합니다.

execute() 함수 내에 INSERT문을 보면 총 세 개의 변수에 값을 입력하도록 되어 있습니다. 첫번째 변수인 i는 앞서 설명 드린 바와 같이 1에서 4까지 증가를 합니다. 다음은 cellNumber 리스트입니다. i - 1을 했으므로 cellNumber는 adress 리스트와 마찬가지로 [0], [1], [2], [3]까지 순차적으로 변경되며 리스트 안에 있는 값들을 저장하게 됩니다. 따라서 AddressBook 테이블에는 다음과 같은 정보가 저장이 됩니다.



id cellNo addr
1 010-1234-5678 인천시 연수동
2 010-4456-2345 경기도 여주시
3 010-5434-5345 서울 강서구
4 010-2407-6520 부산 기장구

 

잠시 AddressBook이라는 테이블을 생성하는 코드를 보겠습니다. 

 

CREATE TABLE AddressBook(id integer, cellNo text, addr text);

 

id, cellNo, addr 세개의 필드가 있습니다. 그리고 CustomerCode를 생성하는 코드도 보겠습니다.

 

CREATE TABLE CustomerCode(id integer unique, name text);

 

두 개의 테이블이 다른 점은 unique 속성을 가진 필드가 있느냐 없느냐 입니다. unique 속성이 있는 CustomerCode 테이블에 정보를 두 번 입력했을 때가 기억나시나요? unique 속성이 깨지기 때문에 에러가 발생했었죠. 기억이 나시나요? 기억이 나지 않는다면 소스코드 중에서 025_dbInsert.py를 실행해 보기 바랍니다. 

AddressBook에 정보를 입력하는 앞의 코드 026_dbInsert2.py는 어떨까요? unique라는 속성을 가진 필드가 없기 때문에 여러번 실행을 시켜도 에러가 발생하지 않습니다. 에러가 발생하지 않는다는 이유는 무엇일까요? 실행할때마다 4개의 데이터가 추가된다는 얘기입니다. 여러번 실행해 보시고 DB Browser를 이용해 AddressBook 테이블을 살펴보시기 바랍니다. 눈으로 확인할 수 있습니다.

 

잠시 CustomerCode 테이블에 있는 데이터를 보면서 테이블간의 관계를 설명해 보겠습니다.



id name
1 홍길동
2 김갑동
3 김순이
4 삼순이

 

AddressBook과 CustomerCode 테이블을 놓고 보면 id라는 공통된 필드가 있습니다. 공통된 필드를 이용하면 ‘홍길동’의 전화번호나 주소를 찾을 수 있습니다. CustomerCode 테이블에서 ‘홍길동’을 찾고 ‘홍길동’의 id ‘1’을 확인합니다. 다시 AddressBook 테이블에서 id ‘1’을 찾고 그에 해당하는 cellNo와 addr을 찾으면 ‘홍길동’에 대한 모든 정보를 확인 할 수 있습니다. 이와 같은 간단한 아이디어가 데이터베이스에서는 사용이 됩니다. 한가지 더 추가한다면 CustomerCode에는 하나의 id에 하나의 사람 밖에 없습니다. 하지만 AddressBook에는 id가 unique하지 않기 때문에 동일한 id가 존재할 수 있습니다. 026.dbInsert2.py가 여러번 실행이 되어도 에러가 발생하지 않는 것처럼요. 이 얘기는 한 사람이 여러 개의 전화번호와 주소를 가질 수 있다는 얘기가 됩니다. unique 옵션에 대해서 확실하게 이해를 하셨기 바랍니다.



반응형