본문 바로가기

코딩/DB

SQLite3 - Table Data 삽입 정리(INSERT)

반응형

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.

 

※ SQLite3 내용 정리 링크

1편 : 2021.03.10 - [코딩/DB] - SQLite3 - Database 파일 생성, Table 생성

2편 : 2021.03.12 - [코딩/DB] - SQLite3 - DB Browser for SQLite 설치 및 실행 정리

3편 ; 2021.03.13 - [코딩/DB] - SQLite3 - Table Data 삽입 정리(INSERT)

4편 : 2021.03.15 - [코딩/DB] - SQLite3 - Table Data 조회 방법 정리(SELECT)

5편 : 2021.03.18 - [코딩/DB] - SQLite3 - Table Data 수정 및 삭제 정리(UPDATE, DELETE)


앞 과정에서 생성했던 'yb_test.db'파일에 신규 Table을 생성하고 data를 삽입하는 내용을 정리해봄.

1. INSERT 쿼리 사용법1 : Column(열) 항목의 순서를 정확히 알고 있을 경우

#yb_test.db connect
con = sqlite3.connect("yb_test.db")

#con 객체에 대한 cursor 형성
cur = con.cursor()

#yb_test라는 이름의 Table 생성, Key는 id_num, name, age 3개
cur.execute("CREATE TABLE IF NOT EXISTS yb_test(id_num INTEGER PRIMARY KEY, name TEXT, age INTEGER)")

# 데이터 삽입, 컬럼의 순서를 정확히 알고 있어야 함(id_num, name, age 순서로 입력)
cur.execute("INSERT INTO yb_test VALUES('2101','YB','22')")
con.commit()


-. 데이터 삽입시 쿼리 문법  : INSERT INTO 'table명' VALUE() 사용
    : 이 쿼리 구문은 생성한 Table의 필드명(Column명) 순서를 정확히 알고 있어야 한다.

-. 맨 마지막의 con.commit( ) 은 반드시 실행시켜줘야 .db파일에 반영이 된다.

-. 만약 commit( ) 후 이전 단계로 돌리고 싶다면 con.rollback( ) 을 사용하면 된다.

 -. commit( ) 을 활용하지 않고 execute ( ) 사용시 바로 반영이 가능하게 하려면 .db 파일 connect 진행시 아래와 같이
     isolation_level=None 을 추가한다.(이전 편에도 설명한 부분임)

con = sqlite3.connect("yb_test.db", isolation_level=None)

  ※ 참고 사항 : 위 코드를 2번 실행시키면 IntegrityError 발생

< sqlite3.IntegrityError >

  해당 오류는 'yb_test'라는 table의 id_num 필드 속성을 PRIMARY KEY(기본키)로 지정하였기 때문이다. 아래 쿼리 구문을 보면 id_num 항목을 PRIMARY KEY로 정의하였다. PRIMARY KEY는 고유한 값으로 중복이 인정되지 않는다. 오류가 발생한 이유는 이미 1번 실행이 되어 DATA 1행(레코드 1개)가 .db파일에 저장되어 있다.
▶ 위 코드 중 cur.execute("INSERT INTO yb_test VALUES('2101','YB','22')") 부분

  '2101'은 id_num 항목의 data로 PRIMARY KEY로 정의되었기 때문에 2번 입력되 면 무결성 에러가 발생한다.


  PRIMARY KEY와 비슷한 것으로 UNIQUE(고유키)가 있는데 2개 차이점이 있어 간단히 정리해보았다.

구분 PRIMARY KEY(기본키) UNIQUE(고유키)
중복 여부 중복 불가 중복 불가
값 입력 여부 반드시 값을 입력해야 함. 값을 입력하지 않아도 됨
(입력안할 시 NULL)
사용 예시 해당 Data(레코드)의 고유 인식 번호 입력하지 않아도 되지만 중복되면
안되는 항목(계좌번호, 주민번호 등)
Table 생성 개수 Table 내 1개만 생성 가능 Table 내 여러개 생성 가능

 

※ 공부가 더 필요한 부분

  위에서 PRIMARY KEY의 겨우 반드시 값을 입력해야 한다고 했었는데 아래와 같이  null을 입력해보았을 때 정상적으로 실행되는 것을 확인 함. 이유를 아직 찾지 못해서 나중에 찾아볼 예정임

import sqlite3
con = sqlite3.connect("yb_test.db")
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS yb_test(id_num INTEGER PRIMARY KEY, name TEXT, age INTEGER)")

# 데이터 삽입
cur.execute("INSERT INTO yb_test VALUES(null,'YB','22')")
cur.execute("INSERT INTO yb_test VALUES(null,'YB','23')")

<결과 : PRIMARY KEY인데 NULL이 허용 됨 >

 



 

2. INSERT 쿼리 사용법2 : Column(열) 항목의 순서를 정확히 몰라도 사용할 수 있는 방법

#Case 1 : id_num, name, age 순서
cur.execute("INSERT INTO yb_test(id_num, name, age) VALUES(?,?,?)", (2021, 'YB2', '25'))

#Case 2 : age, name, id_num 순서
cur.execute("INSERT INTO yb_test(age, name, id_num) VALUES(?,?,?)", (26, 'YB3', 2022))

   위 코드를 보면 Column 항목명만 정확히 알고 있으면 튜플이나 리스트 형태로 data를 삽입할 수 있다. 위 구문을 실행해보고 결과를 확인하면 2개의 data가 더 추가된 것으로 확인된다.

<결과>

 

3. INSERT 쿼리 사용법3 : 여러 data를 한번에 넣고 싶은 경우(리스트, 튜플 모두 가능)

test_list = (
    [3025, 'list5', '31'],
    [3026, 'list6', '34'],
    [3027, 'list7', '33']
)

cur.executemany("INSERT INTO yb_test(id_num, name, age) VALUES(?,?,?)", test_list)

  리스트 3개로 구성된 튜플 test_list가 있다. 입력해야 할 행이 2개 이상인 겨우 지금까지 사용했던 execute( )를 사용하면 오류가 난다. 위 코드와 같이 cur.executemany( ) 를 사용해야 여러 data를 table에 한번에 추가할 수 있다. 아래 결과 파일의 경우 5,6,7 번의 data는 리스트로 8,9,10번 data의 경우는 튜플로 입력해보았다.

<결과>


 ※ 참고 사항 : excute( ) vs executemany( )

excute( ) : 하나의 tuple을 입력할 수 있다.

executemany( ) : 여러개의 tuple을 한번에 입력할 수 있다.

test_list = (
    [1, 'James', '31'],
    [2, 'Lucky', '34'],
    [3, 'Apple', '33']
)

#data 삽입
cur.execute("INSERT INTO '210227_test'(id_num, name, age) VALUES(?,?,?)", test_list)
con.commit()
cur.close()
con.close()

   위와 같이 작성해서 코드를 실행시켜보면 오류가 난다. 입력해야할 data가 복수개의 data인데 execute로 실행시켰기 때문이다.

< Error >

728x90