티스토리 뷰

python lecture/basic

[edu] sqlite3 (db, sql)

burningrizen 2019. 1. 28. 15:56


[SQLite3]


SQLite는 별도의 DB 서버가 필요없이 DB 파일에 기초하여 데이타베이스 처리를 구현한 Embedded SQL DB 엔진이다. 


SQLite는 별도의 복잡한 서버 설치가 필요 없고, 쉽고 편리하게 사용할 수 있다는 점에서 널리 사용되고 있다. 


오늘날 대부분의 Mac OS X 나 리눅스에서는 SQLite을 기본적으로 내장하고 있지만, 


만약 시스템에 내장되어 있지 않는 경우는 http://www.sqlite.org 에서 다운받아 설치할 수 있다. 


SQLite는 기본적으로 SQLite DB 엔진과 "sqlite3" 라는 Command line tool 을 갖고 있다.




[초기화 및 테이블/필드 추가]


import sqlite3


con = sqlite3.connect(':memory:') # ./test.db
cur = con.cursor()
cur.execute("create table phonebook(name text, phone text)")
cur.execute("insert into phonebook values('kim', '111')")
cur.execute("insert into phonebook values('lee', '222')")
cur.execute("insert into phonebook values('park', '010-1234-5678')")
cur.execute("update phonebook set name='choi', phone='333' where name='kim' or name='lee'")
cur.execute("delete from phonebook where name='park'")
cur.execute("select * from phonebook")
con.commit()
for row in cur:
print(row)


우선 sqlite3 모듈을 임포트 해야 한다.


파이썬 2.5 이상 부터는 내장되어 있다.


connect 할 경로를 지정한다. memory 에 저장할 수 있고, 파일 경로를 지정해 주면 파일에 저장된다.


excute 함수를 통해 명령어를 입력한다.


추가/삭제 후에는 commit() 를 호출해야 db 에 적용이 된다.





[모든 테이블 가저오기]

cur.execute("select name from sqlite_master where type='table'")
print([table[0] for table in cur])



[테이블 찾기]

cur.execute("select name from sqlite_master where type='table' and name='phonebook'")
table = [tb[0] for tb in cur]
print(table)



[테이블 삭제]

cur.execute("drop table phonebook")


[필드 단일 삽입]

cur.execute("insert into phonebook values('kim', '010-1234-5678')")


[필드 다중 삽입]

cur.executemany("insert into phonebook1 values(?,?)", [("kim", "010-2222-3333"), ("lee", "010-3333-4444")])



[필드 가저오기]

cur.execute("select * from phonebook")
print("keys=", [fd[0] for fd in cur.description])
print("values=", [row for row in cur])











functional

import sqlite3


def handler(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except sqlite3.OperationalError as e:
print(e)
except Exception as e:
print(e)
return wrapper


@handler
def create_table(con, table, *args):
cur = con.cursor()
fields = ("{} text," * len(args)).format(*args)[:-1]
cur.execute("create table {}({})".format(table, fields))


@handler
def insert_fields(con, table, field_list):
cur = con.cursor()
cur.executemany("insert into {} values({})".format(table, ",".join(['?']*len(field_list[0]))), field_list)


@handler
def find_table(con, table):
cur = con.cursor()
cur.execute("select name from sqlite_master where type='table' and name='{}'".format(table))
table = [tb[0] for tb in cur]
return table[0] if table else []


@handler
def delete_tables(con, tables):
cur = con.cursor()
for table in tables:
cur.execute("drop table {}".format(table))


@handler
def select_table(con, table, key=False):
cur = con.cursor()
cur.execute("select * from {}".format(table))
values = [row for row in cur]
return [tuple([fd[0] for fd in cur.description])] + values if key else values


@handler
def get_tables(con):
cur = con.cursor()
cur.execute("select name from sqlite_master where type='table'")
return tuple([table[0] for table in cur])


# if __name__ == "__main__":
# with sqlite3.connect(':memory:') as con:
# create_table(con, 'phonebook1', 'name', 'phone', 'address', 'email')
# insert_fields(con, 'phonebook1', [('lee', '011', '서울', 'gmail'), ('kim', '010', '서울', 'naver')])
# con.commit()
# print([table for table in get_tables(con)])
# print(select_table(con, 'phonebook1', key=True))
# print(select_table(con, 'phonebook1'))


댓글