c.executemany("INSERT INTO users(id, username, email, phone, website, regdate) VALUES (?,?,?,?,?,?)",userList)
import datetime
# 삽입 날짜 생성
now = datetime.datetime.now() # import 패키지 datetime. class datetime. 함수 now()
print('now :', now)
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S') # strf(oma)time 함수 이용
print('nowDatetime : ',nowDatetime)
import sqlite3
print('sqlite3.version :', sqlite3.version)
print('sqlite3.sqite_version :', sqlite3.sqlite_version)
DB 생성 & Auto Commit (장기 저장)/ (Rollback) - 삽입 이전으로 되돌림
conn = sqlite3.connect('C:/Users/ifjiej/Desktop/python_basic/resource/database.db', isolation_level=None)
isolate_level = None 을 하게 되면 자동으로 커밋을 해준다.
Cursor 커서
c = conn.cursor()
print('Cursor Type : ', type(c))
타입형태는 <class 'sqlite3.Cursor'> 이다.
테이블 생성(Data Type : TEXT, NUMERIC, INTEGER, REAL, BLOB)
텍스트 숫자 정수 리얼데이터 파일저장
c.execute("CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, username text, email text \
,phone text, website text, regdate text)")
execute() - 실행 메서드를 사용해서 sqlite3.connect() 로 database.db 파일과 연결되어 있는 상태로 conn.cursor() 로
커서 클래스로 만든 뒤 c 변수에 할당한 뒤 c.execute() 메서드를 사용한다.
sqlite3 의 문법은 다음과 같다.
CREATE TABLE (IF NOT EXISTS) 존재하지않다면은 옵션 users(테이블이름) (id INTEGER PRIMARY KEY, username text, email text, phone text, website text, regdate text)
테이블 열(column) 이름 (띄우고) 데이터 타입 순으로 적는다.
테이터 삽입
c.execute("INSERT INTO users VALUES(1, 'Kang', 'mike1124@naver.com', '010-2629-1082',\
'Kang.com', ?)", (nowDatetime,)) # 여기서 왜 튜플 삽입시 ,(콤마)를 뒤에 적어주는가?
궁금증 ?? # 여기서 왜 튜플 삽입시 ,(콤마)를 뒤에 적어주는가?
더보기로 확인!
단일 튜플을 사용할 때
파이썬엔 튜플(tuple)이라는 Immutable한 리스트형 타입이 있다. list 타입의 경우 [1]와 같이 하나의 원소를 가진 리스트를 선언하면 원소가 하나인 list타입의 값을 갖게 되지만, tuple의 경우에는 위와 동일하게 하나의 원소만 선언할 경우, 우리가 원하는 원소가 하나인 tuple타입의 값을 얻을 수 없다. 이 때, Comma를 사용하면 단일 튜플을 만들 수 있다.
>>> type((1)) <class 'int'>
>>> type((1,)) <class 'tuple'>
(1)과 같이 선언하면 튜플처럼 보이지만 이는 그냥 하나의 정수값을 나타내는 expression으로 처리되어 int형의 1의 값을 갖게된다. 따라서, 이 표현식을 tuple 타입의 값으로 사용하려면 (1,)와 같이 원소 뒤에 Comma를 붙여 실제 tuple 타입의 값을 갖게 해야한다.
여기서 한 가지 의문이 들 수도 있다. 원소가 하나인 튜플을 언제 사용하는가? 말 그대로 원소가 하나인 리스트를 사용하는것과 같이 원소가 하나인 튜플이 필요한 경우가 분명히 있을 것이다. 특히, 어떤 특정 함수가 튜플을 인자로 받는 경우에 튜플값을 하나만 전달하고자 할 때 단순히 (1)을 써서 타입 에러를 겪어본 적이 한번쯤은 있을 것이다. 이 때 바로 위와 같이 실제 튜플 타입의 데이터를 인자로 전달하면 해당 문제를 해결할 수 있다.
execute_query('...', (1)) # 타입 에러 발생
execute_query('...', (1,)) # 정상적으로 처리
INSERT INTO users VALUES( 순서대로 데이터타입이 열 이름 순으로 적어줘야한다. 마지막 regdate 의 경우 text로 저장되어야하는데, nowDatetime은 str 형태이기 때문에 바로 넣어주면 오류가 발생하므로, ?로 처리 후, 튜플 형태로 넣어준다. 다른 방법은 아래와 같다.
c.execute("INSERT INTO users(id, username, email, phone, website, regdate) VALUES (?,?,?,?,?,?)"
,(2, 'Park', 'Kang@naver.com', '010-1111-1111', 'Kang.com', nowDatetime))
Many 삽입( 튜플, 리스트 )
userList =(
(3, 'Lee', 'lee@naver.com','010-2222-2222', 'Lee.com', nowDatetime),
(4, 'Cho', 'Cho@naver.com', '010-3333-3333','Cho.com', nowDatetime),
(5 ,'Yoo', 'Yoo@google.com','010-4444-4444','Yoo.net', nowDatetime)
)
c.executemany("INSERT INTO users(id, username, email, phone, website, regdate) VALUES (?,?,?,?,?,?)",userList)
위와 같이 하면 executemay()를 통해 한꺼번에 데이터 삽입이 가능하다. (위 형태는 튜플형태로 처리) list 형태로도 처리 가능하다.
테이블 데이터 삭제
conn.execute("DELETE FROM users")
print("users db deleted : ", conn.execute("DELETE FROM users").rowcount)
rowcount는 지워진 데이터의 행개수를 알려준다.
# 커밋 : isolation_level = None 일 경우 자동 반영(오토 커밋)
conn.commit()
# 롤백
conn.rollback()
# 접속해제
conn.close
'python' 카테고리의 다른 글
python - 데이터 베이스 연동(SQLite) , 테이블 데이터 수정 및 삭제 (0) | 2020.04.29 |
---|---|
python - SQLite 테이블 조회, 조건 조회 (0) | 2020.04.29 |
python - 외부 파일 처리/ Excel , CSV 파일 읽기 및 쓰기 (0) | 2020.04.29 |
python - 에러 및 예외 처리 (0) | 2020.04.28 |
python - 파일 읽기 / 쓰기 (0) | 2020.04.28 |