DEVELOP

본 게시물은 데이터베이스 과목의 강의영상과 강의자료를 바탕으로 작성한 학습용 게시물입니다.


DB 사용자 관리

  • 사용자 생성 
    - mySQL의 root 사용자를 모든 용도에 사용하지 말고, 적절한 권한을 가지는 사용자를 생성하여 사용하는게 바람직
    - ex) create users 'db2020'@'%'identicied by 'db2020';
  • 권한 부여 
    - 특정 데이터베이스, 테이블 등에 읽기/쓰기 등의 권한을 부여할 수 있음 
    - ex) grant all privileges on university.*to'dv2020'@'%';

DB 응용프로그램 API 호출 순서 

  1. DB connection 실행
  2. Cursor 생성 
  3. SQL문 실행 
  4. SQL 검색결과 가져오기 
  5. Cursor 닫기 
  6. DB connection 닫기

DB connecion 설정 

  • Pymysql를 import
    - import pymysql
  • DB connection 설정 
    conn = pymysql.connect(host='localhost', user='db2020', password='db2020', db='university')

Cursor 설정 

  • cursor : 하나의 DB connection에 대하여 독립적으로 SQL문을 실행할 수 있는 작업환경을 제공하는 객체
  • 하나의 connection에 동시에 한개의 cursor만 생성할 수 있음 
  • cursor를 통해서 SQL문을 실행할 수 있으며, 응용 프로그램이 실행결과를 튜플 단위로 접근할 수 있도록 해줌 
  • curs = conn.cursor()

SQL문 실행 

  • SQL문 정의
    - sql = "select * from student"
  • SQL 문 실행 
    - curs.execute(sql)

SQL 검색결과 가져오기 

  • 방법1 : 검색결과의 모든 튜플을 한 번에 가져오기 
    rows = curs.fetchall()
    print(rows)
    - 검색결과의 모든 튜플을 응용프로그램 메모리 공간으로 모두 복사함 
    - 튜플이 과다하게 많을 경우, 메모리 복사 오버헤드 발생 
  • 방법 2 : 검색결과의 튜플을 루프를 돌면서 하나씩 차례대로 가져오기 
    rows = curs.fetchone()
    while row:
                 print(row)
                 row = curs.fetchone()
    - 메모리 관리가 효율적 
    - 튜플의 갯수가 현저히 작을때에만 fetchall()을 사용하고, 
      대부분의 경우에는 fetchone() 을 사용하는 습관을 가지는 게 바람직함 

cursor 및 connection 닫기 

  • cursor 닫기 
    curs.close()
  • de connection 닫기
    - 좀비 생기지 않도록 유의

    conn.close() 

SQL 검색결과에서 각 튜플의 애트리뷰트 접근하기 

  • cursor 생성시 pymysql.cursors.DictCursor 값을 설정해 주면 튜플들의 애트리뷰트를 이름으로 접근이 가능
  • curs = conn.cursor(pymysql.cursors.DictCursor)

    sql = "select sno, sname from student"
    curs.execute(sql)

    row = curs.fetchone()
    while row : print("학번 : %d, 이름 : %s" %(row['sno'], row['sname']))
                   row = curs.fetchone() 

튜플 삽입 

  • curs = conn.cursor()
    sql = "insert into student (sno,sname,dept) values (%s,%s,%s)"
    a = (3000,'김선경','컴퓨터')

    curs.execute(sql,a)
    conn.commit() 
  • insert, delete, update 문 이후에는 connection을 commit() 해야, 데이터베이스 반영이 됨 

동시에 복수의 튜플 삽입 

  • curs = conn.cursor()
    sql = "insert into student (sno,sname,dept) values (%s,%s,%s)"
    a = (3000,'김선경','컴퓨터')
    b = (4000,'황산성','산업공학')
    c = (5000,'김호일','경영학')

    student_list =[a,b,c]

    curs.executemany(sql,student_list)
    conn.commit() 

튜플 삭제 

  • curs = conn.cursor()
    sno = 1000
    sql = "delete from student where sno = %s" %(sno)

    curs.execute(sql)
    conn.commit()

튜플 업데이트 

  • curs = conn.cursor()

    dept = 'CS'
    sno = 800
    sql = "update student set dept = '%s' where sno = %d" %(dept,sno)

    curs.execute(sql)
    conn.commit()

동시에 여러개의 connection 및 cursor 생성하는 예 

  • 하나의 connection으로 동시에 하나의 cursor만을 생성하는 게 바람직함 
  • 하나의 cursor는 한번에 하나의 SQL문 실행 가능 
  • 동시에 여러 SQL문을 실행하고자 할 때는 다중 connection 및 cursor 생성할 수 있음 
  • 한 문장의 SQL로 표현하기 어렵거나 비효율적인 경우, 복수의 SQL문을 중첩으로 사용가능 

2단계 SQL문 

  • "컴퓨터과 학생들 중에서 2과목 이상을 수강하는 학생들의 기말고사 점수를 10점씩 올려라"
  • 전략 : 2단계의 중첩 SQL문 수행 
  • 1단계 : 2과목 이상 듣는 학생들의 학번 검색 
    select s.sno
    from student s, enrol e
    where s.sno = e.sno and s.dept = '컴퓨터'
    group by e.sno 
    having count(*) >= 2 
  • 2단계 : 각 학생에 대하여 기말고사 점수를 10점씩 올린다.
    update enrol
    set final = final + 10
    where sno = %d

복수의 connection/cursor 예

  • import mysql 

    conn1 = pymysql.connet(host='localhost', user = 'db201902', password = 'db2020', db = 'university')
    curs1 = conn1.cursor(pymysql.cursors.DictCursor)

    conn2 = pymysql.connect(host='localhost', user = 'db201902', password = 'db2020', db = 'university')
    curs2 = conn2.cursor(pymysql.cursors.DictCursor)

    sql1 = """select s.sno from student s, enrol e where s.sno = e.sno and s.dept = '컴퓨터'
               grpup by e.sno having count(*) >= 2 """

    curs1.execute(sql)

    row = curs1.fetchone() 

    while (row) : 
                   sql2 = """ update enrol set final = final + 10 where sno = %d"""%(row['sno'])
                   curs2.execute(sql2)
                   conn2.commit()
                   row = curs1.fetchone() 
    curs1.close()
    curs2.close()
    conn1.close()
    cinn2,close() 

 

profile

DEVELOP

@JUNGY00N