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')]