Gidhub BE Developer

DB

2018-02-10
goodGid

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


Index