본문 바로가기
Python 과 머신러닝/I. 기초 문법

Python 기초 8장. DB 연동 (1)

by JoyfulS 2019. 10. 14.

< 공부한 내용 >

1. SQLite3

2. CRUD

3. MariaDB

4. MariaDB의 CRUD

 

1. SQLite3

''''

SQLite DB의 특징

 - 내장형 데이터베이스

 - 따라서 외부 접근 불가

 - RDB (관계지향 데이터베이스)

 - 일반 DB와 동일한 쿼리문 사용

 - 다운로드 사이트 : https://www.sqlite.org/index.html

'''

'''
sqlite3 - 내장 DBMS
- 기기 내부에서만 사용
- 외부 접근 허용 안됨
'''
import sqlite3

print(sqlite3.sqlite_version_info) # (3, 28, 0)

try :
     # db 연동 객체 : db 생성 + 연동
     conn = sqlite3.connect("chap08_Database/data/sqlite.db")
     # sql문 실행
     cursor = conn.cursor()

     # table 생성
     sql = """create table if not exists test_tab(
     name text(10),
     phone text(15),
     addr text(50)
     )
     """
     cursor.execute(sql)  # 실제 table 생성

     # 레코드 추가
     cursor.execute("insert into test_tab values('홍길동', '010-111-1111', '서울시')")
     cursor.execute("insert into test_tab values('이순신', '010-222-2222', '해남시')")
     cursor.execute("insert into test_tab values('유관순', '010-333-3333', '충남시')")

     # 레코드 조회
     cursor.execute("select * from test_tab")
     rows = cursor.fetchall() 

     # fetchall() : 객체 안에 있는 모든 값을 가져온다

     for row in rows :
          #print(row) # tuple
          print(row[0], row[1], row[2])

except :
     # db 연동 error 처리
     print('db 연동 error')
     conn.rollback() # db 반영 취소
finally :
     # db 연동 객체 close - 나중에 만들어진 객체를 먼저 닫는게 일반적
     cursor.close()
     conn.close()

 

실행 결과(출력물)

 

2. CRUD

'''
CRUD
 - Create, Read, Update, Delete
commit() / rollback()
 - commit() : db 반영
 - rollback() : db 반영 취소
'''

# 주의사항 : try-except문 안에서 CRUD 실습을 해본 것으로, 1. table생성, 2. 레코드 추가, ... 순서대로 하나하나 실행하면서 실행 후에는 주석처리(중복 생성 등의 오류를 막기 위해) 

 

import sqlite3

try : # db 연동 객체 생성, slq 실행
     conn = sqlite3.connect('chap08_Database/data/sqlite.db')
     # sql 실행 객체
     cursor = conn.cursor()
     # sql문 작성 -> sql 실행

     # 1. table 생성 : 제약조건 적용
     sql = """create table if not exists goods(
     code integer primary key,
     name text(30) unique not null,
     su integer default 0,
     dan real default 0.0
     )"""
     cursor.execute(sql) # sql 실행 : table 생성

     # 2. 레코드 추가
     '''
     cursor.execute("insert into goods values(1, '냉장고', 2, 850000)")
     cursor.execute("insert into goods values(2, '세탁기', 3, 550000)")
     cursor.execute("insert into goods(code, name) values(3, '전자레인지')") # su, dan 생략
     cursor.execute("insert into goods(code, name, dan) values(4, 'HDTV', 1500000)") # su 생략
     conn.commit() # db 반영
     '''

     # 2. 레코드 추가 : 키보드 입력
     '''
     code = int(input("코드 입력 : ")) # 5
     name = input("상품명 입력 : ") # 가스레인지
     su = int(input("수량 입력 : ")) # 3
     dan = float(input("단가 입력 : ")) # 350000
     # java : "insert into goods values(?, ?, ?, ?)"
     sql =f"insert into goods values({code}, '{name}', {su}, {dan})"
     cursor.execute(sql) # 레코드 추가
     conn.commit() # db 반영
     '''

     # 5. 레코드 수정 : 검색 : code, 수정 칼럼 : name, su, dan
     '''
     code = int(input("수정 코드 입력 : ")) # 5
     name = input("수정 상품명 입력 : ") # 가스레인지 -> gas range
     su = int(input("수정 수량 입력 : ")) # 3 -> 2
     dan = float(input("수정 단가 입력 : ")) # 350000 -> 450000
     sql = f"update goods set name = '{name}', su = {su}, dan = {dan} where code = {code}"
     cursor.execute(sql)
     conn.commit() # db 반영
     '''

     # 6. 레코드 삭제 : code 칼럼
     '''
     code = int(input("삭제 코드 입력 : ")) # 5
     # select
     sql = f"select * from goods where code = {code}"
     cursor.execute(sql)
     rows = cursor.fetchall()

     if rows : # True = 해당 code
          # delete
          sql = f"delete from goods where code = {code}"
          cursor.execute(sql)
          conn.commit() # db 반영
     else :
          print('해당 코드 없음')
     '''

     # 3. 레코드 조회 : 전체 레코드
     sql = "select * from goods"
     cursor.execute(sql) # 레코드 조회
     rows = cursor.fetchall() # 레코드 가져오기

     for row in rows :
          print(row[0], row[1], row[2], row[3])

     print('전체 레코드 수 = ', len(rows))

     # 4. 레코드 조회 : 수량 2개 이상 조건 검색

     sql = "select * from goods where su >= 2"
     cursor.execute(sql)
     rows = cursor.fetchall()
     for row in rows :
          print(row[0], row[1], row[2], row[3])

     print('전체 레코드 수=', len(rows))

     # 4. 레코드 조회 : 상품명 조회
     name = input("조회할 상품명 : ")
     sql = f"select * from goods where name like '%{name}%'" # 포함문자 '%name%' 검색
     cursor.execute(sql)
     rows = cursor.fetchall()

     if rows : # null = False
          for row in rows :
               print(row[0], row[1], row[2], row[3])
          print('검색된 레코드 수 =', len(rows))
     else :
          print('해당 상품이 없습니다.')

except Exception as e : # 예외 처리
     print('db 연동 error : ', e)
     conn.rollback() # db 반영 취소
finally: # 객체 닫기(역순)
     cursor.close()
     conn.close()

 

3. MariaDB

'''

MariaDB의 특징

 - RDB : 관계지향 데이터베이스

 - Mysql 개발자에 의해서 개발됨

 - Mysql과 동일한 쿼리문 사용

 - 크기 대비 고성능

 - 다운로드 사이트 : http://mariadb.org/

'''

'''

이 실습을 위해서는 MariaDB를 설치하고 user ID와 password를 지정해놓아야한다. (본인은 user : root, pw : 1234 사용)

'''

설치 이후, MySQL Client 실행 후 비밀번호 입력하고 데이터베이스를 확인한다.

 

 

PyCharm의 File - Settings 에서 PyMySQL 라이브러리를 설치한다

 

** PyCharm에서 MariaDB 사용 준비 완료!!

 

'''
mariaDB 연동 TEST
'''

import pymysql

print(pymysql.version_info) # (1, 3, 12, 'final', 0)

config = {
     'host' : '127.0.0.1',
     'user' : 'root',
     'password' : '1234',
     'database' : 'work',
     'port' : 3306,
     'charset':'utf8',
     'use_unicode' : True}

try :
     # db 환경변수 -> db 연동 객체
     conn = pymysql.connect(**config)

        # **config : config에 들어있는 7개의 환경변수를 이용해서 DB를 연동한다는 의미
     # sql 실행 객체
     cursor = conn.cursor()
     print("db 연동 성공!")

     sql = "show tables"
     cursor.execute(sql)
     tables = cursor.fetchall()

     if tables :
          print('table 있음')
     else :
          print('table 없음')

except Exception as e :
     print('db 연동 error :', e)
finally :
     cursor.close()
     conn.close()


4. MariaDB의 CRUD


import pymysql
config = {
     'host' : '127.0.0.1',
     'user' : 'root',
     'password' : '1234',
     'database' : 'work',
     'port' : 3306,
     'charset':'utf8',
     'use_unicode' : True}

try :
     conn = pymysql.connect(**config)
     cursor = conn.cursor()
     

     ### 1 -> 2 -> (3: 계속 실행) -> 4 -> 5 순서대로 입력 실행해보면서 실행해본건 주석처리함
     # 1. table
     '''
     sql = """create table goods(
     code int primary key,
     name varchar(30) not null,
     su int default 0,
     dan int default 0
     )"""
     cursor.execute(sql) # table 생성
     # table 생성은 commit을 하지 않아도 auto-commit이라서 자동으로 됨
     '''

 

테이블 추가 후 'MySQL Client'에서 생성된 테이블 확인 가능!



     # 2. 레코드 추가
     '''
     code = int(input("코드 입력 : "))
     name = input("상품명 입력 : ")
     su = int(input("수량 입력 : "))
     dan = int(input("단가 입력 : "))
     sql = f"insert into goods values({code}, '{name}', {su}, {dan})"
     cursor.execute(sql) # 레코드 추가
     conn.commit() # db 반환
     '''

     # 4. 레코드 수정 : code 기준 -> name, su, dan 수정
     '''
     code = int(input("수정 코드 : "))
     name = input("수정 상품명 : ")
     su = int(input("수정 수량 : "))
     dan = int(input("수정 단가 : "))
     sql = f"update goods set name='{name}', su={su}, dan={dan} where code={code}"
     cursor.execute(sql)
     conn.commit() # db 반영
     '''

     # 5. 레코드 삭제 : code 기준
     '''
     code = int(input("삭제 코드 : "))
     sql = f"select * from goods where code = {code}"
     cursor.execute(sql)
     row = cursor.fetchall()
     if row :
          sql = f"delete from goods where code = {code}"
          cursor.execute(sql) # 삭제
          conn.commit() # db 반영
     else :
          print("해당 코드 없음")
     '''

     # 3. 레코드 조회 : 전체 레코드
     sql = "select * from goods"
     cursor.execute(sql)
     rows = cursor.fetchall()
     for row in rows :
          print(f"{row[0]} {row[1]} {row[2]} {row[3]}")

     # 3. 레코드 조회 : 상품명(포함문자 검색)
     name = input("조회 상품명 : ")
     sql = f"select * from goods where name like '%{name}%'"
     cursor.execute(sql)
     rows = cursor.fetchall()

     if rows :
          for row in rows :
               print(row)
     else :
          print("해당 상품은 존재하지 않습니다")

except Exception as e :
     print('db error 발생 :', e)
finally :
     cursor.close()
     conn.close()

 

 

---------------------------------------------- example ----------------------------------------------

exam01.py
0.00MB
exam02.py
0.00MB
exam03.py
0.00MB

댓글