※ 이 글을 쓰는 사람은 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 발생
해당 오류는 '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')")
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로 실행시켰기 때문이다.
'코딩 > DB' 카테고리의 다른 글
SQLite3 - Table Data 수정 및 삭제 정리(UPDATE, DELETE) (0) | 2021.03.18 |
---|---|
SQLite3 - Table Data 조회 방법 정리(SELECT) (0) | 2021.03.15 |
SQLite3 - DB Browser for SQLite 설치 및 실행 정리 (0) | 2021.03.12 |
SQLite3 - Database 파일 생성, Table 생성 (1) | 2021.03.10 |