본문 바로가기

Python

Python 데이터베이스 SQLite3를 이용한 예제

#SQLite3란 

- 오프라인, 응용프로그램에 넣어 사용하는 경량 임베디드 데이터베이스

- 라이브러리 호출, 데이터 저장 시 하나의 파일만 사용

- 안드로이드 SDK에도 내장 


#SQLite3 장점

- 작은 크기&간결함 → 간단한 DB 구성 가능

- 크로스플랫폼, 트랜잭션 지원

* 크로스플랫폼(=멀티플랫폼)

- 컴퓨터 프로그램, 운영체제, 컴퓨터 언어, 프로그래밍 언어, 컴퓨터 소프트웨어 등 여러 종류 플랫폼에서 사용 가능을 의미

- 오픈소스 프로젝트

- 네트워크 구성 필요 없다(서버 포함)


#SQLite3 단점

- 호스트 프로그램이 DB처리에 대한 모든 부하 부담(DB엔진 자체가 호스트 프로그램에 임베디드 되기 때문)


#파이썬에서 SQLite3 

- pysqlite 모듈을 통해서 사용

- 기본 포함, 별도의 모듈 설치 안하고 바로 사용 가능


※pysqlite 모듈에 정의된 함수&클래스


 주요 메소드

설명 

 connect(database[, timeout, isolation_level, detect_types, factory])

SQLite3 DB에 연결, 연결된 Connection객체 리턴

 complete_statement(sql) 

세미콜론으로 끝나는 SQL문장에 대해 True 리턴 

 register_adapter(type, callable)

사용자정의 파이썬 자료형, SQLite3에 등록

callable: 변환을 수행하는 함수, 1개의 인자를 받아서 

파이썬에서 처리 가능한 자료형 리턴

 register_converter(typename, callable)

SQLite3에 저장된 자료를 사용자정의 자료형으로 변환하는 함수 등록  typename은 SQLite3에서 내부적으로 사용될 자료형의 이름


※Connection 클래스 함수&클래스


※Cursor 클래스 함수&클래스

- 데이터베이스에 저장된 파일에 연산을 수행하기 위함

- SQL문장 수행, 조회된 결과 가지고 오는 역할




#sqlite_test.py(데이터연동순서)

import sqlite3
db_fileName='Book.db'
conn = sqlite3.connect(db_fileName)
print(conn)
cur = conn.cursor() #커서객체
#cur.execute('drop table Book')
#cur.execute('create table Book(no integer, title text)')
datas=[(1,'python'),(2,'java'),(3,'spring')]
#cur.executemany('insert into Book values(?,?)', datas)
#print('입력한 데이터 갯수: ',cur.rowcount)



# conn.commit()
cur.execute('select no,title from Book')
for row in cur:
print(row)
conn.close()
 
#sql_test.py #(DB연결, 테이블생성, 데이터추가, 데이터조회)
import sqlite3
db = sqlite3.connect("Book.db") #DB 연결
cur = db.cursor() #커서객체 생성
cur.execute('drop table if exists Book')
a=cur.execute('create table Book(no integer, title text)') #테이블생성
b=cur.executemany('insert into Book values(?,?)', [(1,"파이썬")])
print('입력한 데이터 갯수: ', cur.rowcount)
#c=cur.executemany('insert into Book values(2,"JAVA")', []) # insert 안
#cur.execute('sql문')
#cur.executemany('sql문',열거가능한 데이터)
c=cur.execute('insert into Book values(2,"JAVA")')
d=cur.execute('insert into Book values(3,"SQL")')
e=cur.executemany('insert into Book values(?,?)', [(4,"MyBatis"),(5,"AndroidStudio")])
print('입력한 데이터 갯수: ', cur.rowcount) #실행된 행의 개수
print(a)
print(b)
#print(c)
#데이터 조회
print('[데이터 조회1]')
cur.execute('select no,title from book')
for row in cur:
print(row)
print('[데이터 조회2]')
cur.execute('select * from book')
for row2 in cur:
print(row2[0], row2[1]) #컬럼 인덱스를 명시

print('타입체크:', type((1,2,3)))

print('타입체크:', type((1)))
print('타입체크:', type(('abc')))
print('타입체크:', type((1,)))
#title없는 no만 6~10까지 입력
#for i in range(6,11):
# cur.executemany('insert into Book(no) values(?)',[(i,)])
cur.execute('select * from book')
for row3 in cur:
print(row3[0])
db.commit()
db.close()
#sql_test3.py
import sqlite3
#DB수정
db = sqlite3.connect('book.db')
cursor = db.cursor()
cursor.execute('update book set title="Python3"')
print('커서 카운트:',cursor.rowcount)
#전달인자가 없다면 execute(), 있다면 executemany()
cursor.execute('select * from book')
print('커서 카운트:',cursor.rowcount)
#조회된 결과 모두를 리스트형태로 반환
print(cursor.fetchall())
cursor.close()
db.commit()

db.close()


#sql_test4.py
#정렬된 조회, dump파일 만들기
import sqlite3
con = sqlite3.connect('book.db')
cur = con.cursor()
#정렬 조건을 표현하는 함수정의
def myFunc(str1, str2):
s1=str1.upper() #전체 대문자 변환
s2=str2.upper()
#return (s1>s2) - (s1<s2) #오름차순정렬
return (s1<s2) - (s1>s2) #내림차순 정렬
# s1='python' s2='abc' : True - False 1-0 = 1 (True)
# s1='abc' s2='python' : False - True 0-1 = -1
con.create_collation('myordering', myFunc) #명시적인 별칭과 핸들러(myFunc) 대입
cur.execute('select title from book order by title COLLATE myordering')
for r in cur:
print(r[0])
print('=================')
for l in con.iterdump(): #실행된 쿼리구문을 덤프로 만들어 출력
print(l)
print('=================')
with open('dump.sql','w', encoding='utf-8') as f:
for l2 in con.iterdump(): #실행된 쿼리구문을 덤프로 만들어 출력
f.write('{0}\n'.format(l2)) #문자열 안에 { }를 넣고 인덱스 지정, format에는 { }부분에 넣을 값 지정
#sql_test5.py #(Mydb생성, test테이블 생성, 데이터를 입력(인덱스, 콜론 통한))
import sqlite3
db = sqlite3.connect("Mydb.db")
cur = db.cursor()
cur.execute('drop table if exists test')
sql_cmd = 'create table test (id integer, name text)'
cur.execute(sql_cmd)
#execute 통한 입력
sql_cmd = 'insert into test values(?,?)'
cur.execute(sql_cmd,(1,'길라임라임'))
cur.execute(sql_cmd,(2,'홍길동길동'))
for row in cur.execute('select * from test'):
print(row)
print('=====================================')
#콜론을 통한 입력
sql_cmd2 = 'insert into test values(:id,:name)'
cur.execute(sql_cmd2, {'id':3, 'name':'김주원'})
cur.execute(sql_cmd2, {'id':4, 'name':'김유신'})
#cur.execute(sql_cmd2,(0,'gildong'))
#cur.execute(sql_cmd2,(1,'홍길동길동'))
for row2 in cur.execute('select * from test'):
print(row2)
print('======================')
cur.execute('drop table if exists test2')
cur.execute('create table test2 (no integer)')
cur.execute('insert into test2 values (11)')
cur.execute('insert into test2 (no) values (22)')
for row in cur.execute('select no from test2'):
print(row[0])