Python - DB

매일 공부(ML)·2021년 11월 15일
0

CS 

목록 보기
25/33

SQLite

  • 정의: 임베디드 SQL DB엔진으로 서버 필요없이 DB구현

Python DB

  • sqlite3를 통해서 Python 과 DB는 연동된다.

  • conn: SQL연결과 관련된 셋팅 포함

  • Cursor : 질의를 수행하고 결과를 얻는 객체

    • SQL SELECT문 사용할 때 이용된다.(조건에 따라 조회)
    • 습관적으로 코드 칠 때, conn.cursor()치기
  • execute() ; 질의의 실행

  • conn.commit(): DB업데이트

    • 데이터 가져오기만 하는 질의문에선 필요 없다.
    • 데이터의 변경이 실제로 반영(트랜잭션)
  • close(): DB연결 끊기

  • c.executemany():한건번에 여러개의 데이터 처리, list로 관리한다

트랜잭션

  • 정의: 쪼개질 수 없는 업무처리의 단위(원자같은 느낌)

  • 필요 기술

    • Rollback: 부분 작업이 실패하면 실행 전으로 돌린다
    • Commit: 모든 부분작업이 정상적으로 완료하면 변경 사항을 한꺼번에 DB반영
  • ACID : 트랜젝션이 안전하게 수행된다는 것을 보장하는 성질 약어

    • 원자성(Atomicity): 모두 수행 or 모두 수행 안됨
    • 일관성(Consistency): 트랜잭션 완료 후 일관성있는 DB상태 유지
    • 고립성(Isolation): 트랜잭션 수행 시 다른 연산 작업 낄 수 없다
    • 지속성(Durability): 성공이 된 트랜잭션은 영원히 반영된다.

Code

import sqlite3
print("뿅💛")

import os
db_path = os.getenv('HOME')+'/mydb.db'
conn = sqlite3.connect(db_path)# DB이름 정하기(mydb, [이름].[확장자명], sql 세팅과 관련 있음
print(conn)

c = conn.cursor() # Connect()함수 연결 사용하여 cursor객체 생성
print(c)

# stocks이라는 이름의 테이블을 하나 생성합니다. 혹시 이미 생성되었다면 생략합니다. 
c.execute("CREATE TABLE  IF NOT EXISTS  stocks (date text, trans text, symbol text, qty real, price real)")

# stocks 테이블에 데이터를 하나 인서트합니다. 
c.execute("INSERT INTO stocks VALUES ('20200701', 'TEST', 'AIFFEL', 1, 10000)")

# 방금 인서트한 데이터를 조회해 봅니다.
c.execute("SELECT * FROM stocks")

# 조회된 내역을 커서를 통해 가져와 출력해 봅니다.
print(c.fetchone())

conn.commit()   # commit()은 cursor의 메소드가 아니라 connection의 메소드입니다. 
print("뿅💛")

*DDL문

import sqlite3
import os
db_path = os.getenv('HOME')+'/mydb.db'

conn = sqlite3.connect(db_path)
c = conn.cursor()

#- ! 재실행 시 테이블이 존재할 수 있으므로 아래처럼 해당 테이블들을 모두 지워줍니다.
c.execute("DROP TABLE IF EXISTS 도서대출내역")
c.execute("DROP TABLE IF EXISTS 도서대출내역2")
c.execute("DROP TABLE IF EXISTS 대출내역")
c.execute("DROP TABLE IF EXISTS 도서명")


#----- 1st table : 도서대출내역 -----#
c.execute("CREATE TABLE IF NOT EXISTS 도서대출내역 (ID varchar, 이름 varchar, 도서ID varchar, 대출일 varchar, 반납일 varchar)")
#- 생성(create)문 : 테이블명, 변수명, 변수타입을 지정

data = [('101','문강태','aaa','2020-06-01','2020-06-05'),
             ('101','문강태','ccc','2020-06-20','2020-06-25'),
             ('102','고문영','bbb','2020-06-01',None),
             ('102','고문영','ddd','2020-06-08',None),
             ('103','문상태','ccc','2020-06-01','2020-06-05'),
             ('104','강기둥',None,None,None)]
#- 입력할 데이터를 그대로 입력 (변수명 순서 기준대로)

c.executemany('INSERT INTO 도서대출내역 VALUES (?,?,?,?,?)', data)
#- 입력할 데이터를 실제 테이블에 insert하기
#-----------------------------------------------#


#----- 2nd table : 도서대출내역2 -----#
c.execute("CREATE TABLE IF NOT EXISTS 도서대출내역2 (ID varchar, 이름 varchar, 대출년월 varchar, 대출일수 varchar)")

data = [('101','문강태','2020-06','20일'),
             ('102','고문영','2020-06','10일'),
             ('103','문상태','2020-06','8일'),
             ('104','강기둥','2020-06','3일')]
c.executemany('INSERT INTO 도서대출내역2 VALUES (?,?,?,?)', data)
#--------------------------------------------------#


#----- 3rd table : 대출내역 -----#
c.execute("CREATE TABLE IF NOT EXISTS 대출내역 (ID varchar, 이름 varchar, 도서ID varchar)")

data = [('101','문강태','aaa'),
             ('102','고문영','bbb'),
             ('102','고문영','fff'),
             ('103','문상태','ccc'),
             ('104','강기둥',None)]
c.executemany('INSERT INTO 대출내역 VALUES (?,?,?)', data)
#-----------------------------------------#


#----- 4th table : 도서명 -----#
c.execute("CREATE TABLE IF NOT EXISTS 도서명 (도서ID varchar, 도서명 varchar)")

data = [('aaa','악몽을 먹고 자란 소년'),
             ('bbb','좀비아이'),
             ('ccc','공룡백과사전'),
             ('ddd','빨간구두'),
             ('eee','잠자는 숲속의 미녀')]

c.executemany('INSERT INTO 도서명 VALUES (?,?)', data)
#--------------------------------------#

conn.commit()
conn.close()
print("뿅💛")

conn = sqlite3.connect(db_path)
c = conn.cursor()

for row in c.execute('SELECT * FROM 도서명'):
  print(row)
profile
성장을 도울 아카이빙 블로그

0개의 댓글