Python-DB

4 minute read

Python SQLite

SQLite는 별도의 DB서버가 필요없이 DB 파일에 기초하여 데이터 베이스 처리를 구현한 Embedded SQL DB Engine이다.
보통 스마트폰에 내장되어 활용되고 있다.
DB 파일 생성 방법

  1. conn = sqlite3.connect(“example.db”) -> 명시한 파일명으로 생성된다.
  2. conn = sqlite3.connect(“:memory:”) -> 휘발성으로 생성된다. -> 테스트용으로 적합하다.

DB 사용 대표 명령어

종류설명
cursor()sql 문 처리를 위한 객체 생성
execute()쿼리문을 실행시킬 때 사용하는 함수
fetchone()한 개의 레코드만 읽어올때 사용하는 함수
fetchall()모든 레코들 읽어올 때 사용하는 함수


Python은 DB 연동 시, 자바와는 달리 커서의 이동을 해주지 않아도 자동으로 이동한다.

Python과 SQLite의 자료형 비교

PythonSQLite
NoneNULL
intINTEGER
floatREAL
strTEXT
byteBLOB


SQLite 기본 연습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#SQLite.py
# 개인용 DBMS - SQLite3

import sqlite3
print(sqlite3.sqlite_version)

print()
conn = sqlite3.connect("example.db") #파일로 생성된다.
#conn = sqlite3.connect(":memory:") #휘발성으로 생성된다.

try:
    cur = conn.cursor() #sql문 처리를 위한 객체를 생성
    cur.execute("create table if not exists friend(name text, phone text, addr text)")
    cur.execute("insert into friend values('한국인', '111-1111', '역삼동')")
    cur.execute("insert into friend values('고길동', '222-2222', '강남역 11번출구 앞')")
    cur.execute("insert into friend values(?,?,?)", ('나길동', '333-3333', '강남역 10번출구 계단'))
    mydata = ('심길동', '444-4444', '강남대로 한복판')
    cur.execute("insert into friend values(?,?,?)", mydata)
    conn.commit()
    
    #select 
    cur.execute("select * from friend")
    print(cur.fetchone()) #한 개의 레코드 읽기
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    '''
    ('한국인', '111-1111', '역삼동')
    ('고길동', '222-2222', '강남역 11번출구 앞')
    ('나길동', '333-3333', '강남역 10번출구 계단')
    ('심길동', '444-4444', '강남대로 한복판')
    ('한국인', '111-1111', '역삼동')
    ('고길동', '222-2222', '강남역 11번출구 앞')
    ('나길동', '333-3333', '강남역 10번출구 계단')
    '''
    print(cur.fetchall()) #전체 레코드 읽기
    '''
    [('한국인', '111-1111', '역삼동'),
    ('고길동', '222-2222', '강남역 11번출구 앞'),
    ('나길동', '333-3333', '강남역 10번출구 계단'),
    ('심길동', '444-4444', '강남대로 한복판')]
    '''
    #이름 오름차순으로 자료 출력
    cur.execute("select name, addr, phone from friend order by name asc")
    for r in cur:
        print(r)
    '''
    ('고길동', '222-2222', '강남역 11번출구 앞')
    ('나길동', '333-3333', '강남역 10번출구 계단')
    ('심길동', '444-4444', '강남대로 한복판')
    ('한국인', '111-1111', '역삼동')
    '''
except Exception as e:
    print("err: "+str(e))
    conn.rollback()
finally:
    conn.close()    
        


SQLite CRUD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#SQLite_CRUD.py
import sqlite3

def dbFunc(dbName):
    try:
        conn = sqlite3.connect(dbName)
        c = conn.cursor()
        c.execute("drop table if exists jikwons")
        c.execute("create table if not exists jikwons(id integer primary key, name text)")
        
        #insert
        c.execute("insert into jikwons values(1, '가나다')")
        
        t_data = (2, "신기해") #tuple data
        c.execute("insert into jikwons values(?,?)", t_data)
        t_data2 = 3, "신선해" #tuple data : 괄호 없이 줘도 튜플이다.
        c.execute("insert into jikwons values(?,?)", t_data2)
        t_data3 = ((4, "신기루"), (5, "신라면"))
        c.executemany("insert into jikwons values(?,?)", t_data3)
        
        l_data = [6, "공기밥"] #list data
        c.execute("insert into jikwons values(?,?)", l_data)
        
        d_data = {"id": 7, "name":"고래밥"} #dict data : key에 의한 매핑
        c.execute("insert into jikwons values(:id, :name)", d_data)
        d_data2 = {"sabun": 8, "irum":"주먹밥"} #dict data
        c.execute("insert into jikwons values(:sabun, :irum)", d_data2)
        
        #updata
        up_data = ("박치기", 7) # ["박치기", 7] -> 이렇게도 가능하다.
        c.execute("update jikwons set name=? where id=?", up_data)
        
        #delete
        del_data = (4,) #(4) -> 4 와 같다. 
        c.execute("delete from jikwons where id=?", del_data)
        
        conn.commit()
        
        #select
        print("출력1")
        c.execute("select * from jikwons")
        for r in c:
            print(str(r[0])+" "+r[1])
        '''
                 출력1
        1 가나다
        2 신기해
        3 신선해
        5 신라면
        6 공기밥
        7 박치기
        8 주먹밥
        '''
        print("출력2 : 부분자료")    
        #c.execute("select * from jikwons where id <= 2")
        c.execute("select * from jikwons where name= '%s' " %'신기해')
        for r in c.fetchall():
            print(str(r[0])+" "+r[1])
        '''
                출력2 : 부분자료
        2 신기해
        '''    
        print("출력3 : 함수 사용") 
        c.execute("select count(*)  from jikwons")        
        print("건 수: "+str(c.fetchone()[0]))
        '''
                  출력3 : 함수 사용
                  건 수: 7
        '''
    except Exception as e:
        print("err: "+str(e))
        conn.rollback()
    finally:
        conn.close()  
        
if __name__ == '__main__':
        dbFunc("test.db")         
        


Python MariaDB 연동하기

  1. 다운로드링크에서 mysqlclient-1.4.2-cp37-cp37m-win_amd64.whl 파일 다운로드
  2. cmd 창에서 pip install mysqlclient-1.4.2-cp37-cp37m-win_amd64.whl 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#MariaDB.py
import MySQLdb
config = {
    'host':'127.0.0.1',
    'user':'root',
    'password':'123',
    'database':'test',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}
#################################################
while(True):
    print("*********************************")
    print("1. 상품등록 / 2. 상품검색")
    menu=int(input("무엇을 하시겠습니까?"))
    
    if menu == 1:
        data=[]
        data.append(str(input("상품명을 입력하세요:")))
        data.append(int(input("수량을 입력하세요:")))
        data.append(int(input("단가를 입력하세요:")))

        print(data)
        isUpdate=str(input("상품을 등록하시겠습니까? (Y/N)"))
        if isUpdate == "Y" or isUpdate == "y":
            try:
                conn = MySQLdb.connect(**config)
                cursor = conn.cursor()
                    
                #max(c0de) 가져오기
                sql = "select 'max(code)' from sangdata"
                code = int(cursor.execute(sql))+1
                    
                #insert
                sql = "insert into sangdata values(%s, %s, %s, %s)"
                sql_data = code, data[0], data[1], data[2]
                cursor.execute(sql, sql_data)
                conn.commit()
                    
                #select
                sql = "select * from sangdata"
                sql2 = "select count(code) from sangdata"
                cursor.execute(sql)

                for (code, sang, su, dan) in cursor:    
                    print(code, sang, su, dan)
                count=cursor.execute(sql2)
                print("건 수: ", count)
                
                        
            except Exception as e:
                print("err: "+str(e))
                conn.rollback()
                
            finally:    
                cursor.close()
                conn.close()
                    
        else: 
            print("프로그램을 종료합니다.")
            break

    elif menu == 2:
        try:
            conn = MySQLdb.connect(**config)
            cursor = conn.cursor()
            
            #select
            sql = "select * from sangdata"
            sql2 = "select 'count(code)' from sangdata"
            cursor.execute(sql)

            for (code, sang, su, dan) in cursor:    
                print(code, sang, su, dan)
            count=cursor.execute(sql2)
            print("건 수: ", count)
            
        except Exception as e:
            print("err: "+str(e))
            conn.rollback()
                
        finally:    
            cursor.close()
            conn.close()    
    
    else: 
        print("1. 상품등록 / 2. 상품검색 중 선택하세요.")
        continue


결과화면

실제 DB 결과



참조:원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment