DB 연결
-
DB를 사용하려면 실제 저장된 DB 파일을 반영하는 Connection 객체를 생성해야 합니다.
-
해당하는 물리적인 DB 파일이 없는 경우 해당 경로에 파일을 생성하며
파일이 이미 존재하는 경우 그 DB파일을 그대로 사용한다.
import sqlite3
con = sqlite3.connect("test.db")
-
:momory
라는 키워드를 사용해 메모리상에 DB 파일을 만들 수 있따. -
이러한 경우 연결이 종료되면 현재까지 작업한 모든 내용이 사라지지만
물리적인 DB 파일에 기록하는 것보다는 연산 속도가 빠르다.
import sqlite3
con = sqlite3.connect(":momory")
SQL문 수행
-
기본적으로
Cursor.execute()
메서드는 SQL 문을 입력받아 수행한다. -
아래 코드는 전화번호부 테이블을 생성하고 레코드 하나를 입력하는 예제이다.
import sqlite3
con = sqlite3.connect(":momory")
cur = con.cursor() # 커서 객체 생성
cur.execute("CREATE TABLE PhoneBook(Name text, PhoneNum text);")
cur.execute("INSERT INTO PhoneBook VALUES('Derick','010-1234-5678');")
# [1]
cur.execute("INSERT INTO PhoneBook VALUES(?,?);",(name,phoneNumber))
# [2]
cur.execute("INSERT INTO PhoneBook VALUES(:inputName, :inputNum);",
{"inputNum":phoneNumber, "inputName":name})
-
[1] : SQL 구문에서 인자로 채워질 부분을 ?로 표시하고, 해당 인자를
시퀀스 객체
로 전달한다. -
[2] : SQL 구문의 각 인자에 이름을 부여하고 인자를 전달한다.
-
동일한 SQL 문장을 매개변수만 바꾸면서 연속적으로 수행하는 경우,
Cursor.executemany()
를 이용한다. -
인자에 시퀀스와 사전을 전달한다.
datalist = ( ('Tom','010-123-4567'), ('DSP','010-321-7654') )
cur.executemany("INSERT INTO PhoneBook VALUES(?,?);",datalist)
- 시퀀스 객체 대신에
이터레이터
/제너레이터
를 이용할 수도 있다.
# 제너레이터를 이용한 예
def dataGenerator():
datalist = { ('Tom','010-123-4567'), ('DSP','010-321-7654') }
for item in datalist:
yield item
cur.executemany("INSERT INTO PhoneBook VALUES(?,?);",datalist())
-
수행해야할 SQL 구문을 파일에 저장하고 한 번에 수행한다면
Cursor.executescript()
를 이용한다. -
이 메서드는 스크립트 수행하기 전에
우선 커밋을 수행해 이전에 작업한 내용을 모두 DB에 반영하고 그 다음 입력된 스크립트를 수행한다.
import sqlite3
con = sqlite3.connect(":momory")
with open('script.txt') as f: # script.txt에서 SQL 구문을 읽음
SQLScript = f.read()
cur = con.cursor()
cur.executescript(SQLScript)
레코드 조회
- 입력된 데이터를 DB로부터 가져오는(
fetch
) 메서드에 대해 알아보자.
cur.execute("SELECT * FROM PhoneBook;")
for row in cur:
print(row)
('Derick', '010-1234-5678')
('GoodGid', '010-1234-5678')
-
Cursor.fetchone()
은 조회된 결과 집합으로부터 Row 객체를 가져온다. -
Cursor.fetchmany(n)
은 조회된 결과에서 인자로 입력된 n개 만큼 Row를리스트 형태
로 반환한다. -
Cursor.fetchall()
은 조회된 결과의 다음 Row부터 모든 레코드를리스트 행태
로 반환한다. -
아래와 같이
fetchone()
메서드로 1개의 레코드를 조회한 이후fetchmany()
를 호출하면 이미 조회된 1개의 레코드를 제외한 다음 레코드부터 반환한다. -
만약 조회된 전체 결과 집합보다 큰 값이 인자로 입력되면 조회된 결과를 모두 반환한다.
cur.execute("SELECT * FROM PhoneBook;")
print( cur.fetchone() )
print( cur.fetchmany(2) )
print(" ========== ")
cur.execute("SELECT * FROM PhoneBook;")
print( cur.fetchmany(5) )
print(" ========== ")
cur.execute("SELECT * FROM PhoneBook;")
print( cur.fetchone() )
print( cur.fetchall() )
('GoodGid1', '010-1')
[('GoodGid2', '010-2'), ('GoodGid2', '010-3')]
==========
[('GoodGid1', '010-1'), ('GoodGid2', '010-2'), ('GoodGid2', '010-3'), ('GoodGid4', '010-4')]
==========
('GoodGid1', '010-1')
[('GoodGid2', '010-2'), ('GoodGid2', '010-3'), ('GoodGid4', '010-4')]