파이썬(Python)

파이썬 - 내장 DB(SQL), 서버 DB(SQL)

BlueNoa 2023. 3. 4. 22:03
728x90
반응형

•파이썬 DB모듈

파이썬에는 서버에서 사용하는 목적이 아닌 개인이 사용하기 위한 SQL 모듈을 지원한다.

바로 'sqlite3'이라는 모듈로 개인용으로 사용하거나 모바일 기기, 임베디드 시스템 또는 소규모의 웹사이트 제작에 효과적이다. 사용하는 방법은 그리 어렵지 않다. DB와 관련된 명령어는 SQL 명령어와 동일하다.

반응형

(예시1)

import sqlite3
# print(sqlite3.sqlite_version_info) # sqlite3의 버전을 알 수 있다.
# SQL문과 명령어가 동일하다.

# 일반적인 db 생성 방법
con_1 = sqlite3.connect('ex.db') # 예시 DB파일이 현재 모듈과 같은 경로에 저장된다. 연결 객체 생성
con_2 = sqlite3.connect(':memory:') # RAM에 DB가 저장된다. 휘발성이므로 주의해야 한다.

# 함수를 이용해서 생성
def DB_func(DB_name):
    try:
        con_1 = sqlite3.connect(DB_name)
        # 객체 생성
        cur = con_1.cursor() # sql 실행 가능하게 해주는 객체
        # 테이블 생성
        cur.execute("drop table if exists car") # car라는 테이블이 이미 존재하면 삭제 
        cur.execute('create table if not exists car(id integer primary key, model text, type text)') # 없다면 생성
        
        # 일반적인 DB 자료 입력 방법
        cur.execute('insert into car values(1, "K5", "승용차")')
        cur.execute('insert into car values(2, "Sorento", "SUV")')
        
        # 대입으로 자료 입력 방법
        data1 = (3, "model_Y", "SUV") # 괄호 없이 작성해도 됨, 리스트 형태로 작성도 된다.
        cur.execute('insert into car values(?, ?, ?)', data1)
        data2 = {'id':4, 'model':'CASPER', 'type':'경차'}
        cur.execute('insert into car values(:id, :model, :type)', data2) # dict 타입은 특이하게 입력한다.
        
        
        con_1.commit() # con_1에 커밋해준다.(데이터 현 상황 연동)
        
        
        # 자료 읽어오기
        cur.execute('select * from car') # 파일을 불렁면 항상 레코드 포인터는 첫 번째 앞을 지정하고 있다.(한 개의 레코드 포인터)
        # 출력되는 자료의 타입은 '튜플'이다. 하나만 불러오는 경우 print(cur.fetchone()), 전체 보기는 cur.fetchall()
        print(cur.fetchall())
        
    except Exception as e:
        print(e) 
        con_1.rollback() # 오류가 발생하면 오류 발생 전으로 수정
        
    finally:
        con_1.close() # 마지막으로 종료해준다.
        
if __name__ == '__main__':
    DB_func('ex.db')
[('K5', '승용차'), ('Sorento', 'SUV'), ('model_Y', 'SUV')]

예시1이 개인 컴퓨터에서 이용되는 DB였다면 이번엔 원격 데이터베이스 서버와 연결하는 방법에 대한 이야기다.

무료로 제공되는 MySQL을 이용한다.

작동되는 순서는 드라이버 파일의 설치, 모듈 불러오기, Connection 객체를 이용한 DB연결, SQL문 사용을 위한 Cursor 객체 순이다.

 

MySQL 설치 후 실행해주어야 한다. 해당 사진은 HeidiSQL 사용

(SQL문으로 HeidiSQL에서 데이터 베이스와 테이블을 먼저 만들어주고 연동한다.)

CREATE TABLE product(p_code INT PRIMARY KEY, p_name VARCHAR(20) NOT null, p_quantity INT, p_price INT);

(예시2)

import MySQLdb


config = {
    'host':'127.0.0.1', # 기본 sql 주소
    'user':'root',
    'password':'123',
    'database':'test_1',
    'port':3306, # 기본 포트
    'charset':'utf8', # 한글 사용을 위한 설정
    'use_unicode':True # 전송 값을 유니코드로 할 것인지 여부
    }

def func():
    try:
        # 객체 생성
        conn = MySQLdb.connect(**config) # 키워드 파라미터(입력 값을 모두 사전형으로 만듦)
        cursor = conn.cursor()
        
        # 데이터 입력
        # 방법1
        data_input1 = 'insert into product(p_code, p_name, p_quantity, p_price) values(1, "콜라", 1, 1400)'
        cursor.execute(data_input1)
        # 방법2
        data_input2 = ('2', '사과맛 사탕', 10, '2400') # int type의 경우 따음표를 둘러도 되고 안둘러도 된다.
        sql = 'insert into product(p_code, p_name, p_quantity, p_price) values(%s, %s, %s, %s)'
        cursor.execute(sql, data_input2) # 내부 서버와는 다르게 values(?,?,?,?)가 아닌 %s로 받아온다.
        
        # 데이터 수정
        sql = 'update product set p_name = %s where p_code = %s' # p_code가 기본키이므로 기준으로 잡는다.
        data_update = ('포도맛 캔디', 2)
        cursor.execute(sql, data_update)
        
        # 데이터 삭제
        # 보안에 취약한 버전
        data_del = '콜라'
        """
        sql = 'delete from product where p_code = ' + data_del
        """
        # 보안을 고려한 방법
        sql = 'delete from product where p_name = "{0}"'.format(data_del) # 맵핑 방식 권장
        cursor.execute(sql)
        
        # 자료 읽기
        sql = 'select * from product'
        cursor.execute(sql)
        
        conn.commit()
        
        for data in cursor.fetchall():
            print('%s %s %s %s' %data)
        
        print()
        for i in cursor:
            print(i[0], i[1], i[2], i[3])
        
        print()
        for a, b, c, d in cursor:
            print(a, b, c, d)
        
    except Exception as e:
        print(e)
        conn.rollback() # 에러가 발생할 경우 반영하지 않고 롤백(복원)
    
    finally:
        # 항상 닫아주는 것을 잊지 말자.
        cursor.close()
        conn.close()
    
if __name__ == '__main__':
    func()
2 포도맛 캔디 10 2400

2 포도맛 캔디 10 2400

2 포도맛 캔디 10 2400

 

728x90
반응형

'파이썬(Python)' 카테고리의 다른 글

파이썬 - 파일(I/O)  (0) 2023.02.25
파이썬 - 클래스(3)  (0) 2023.02.18
파이썬 - 클래스(2)  (0) 2023.02.08
파이썬 - 클래스(1)  (0) 2023.01.25
파이썬 - 읽고 쓰기와 모듈(Module)  (2) 2023.01.19