본문 바로가기

PYTHON 공부 - PY4E

PY4E - Chapter 15 Database (1)

Part 1

 

1. 옛날에는 저장 공간이 많지 않았음.
2. 영구적인 저장은 순서대로 이루어졌다.
3. 읽기 과정은 순서대로였다.

4. 데이터에 무작위에 접근하면 순차적으로 접근할 필요
5. 데이터 베이스는 무작위로 접근 가능 
6.  영구적인 데이터를 읽거나  수정하고 접근하는 방법. 데이터의 일관성을 보장 되지 않았다.

7. 관계형데이터베이스는 유일성이 없었고. 그렇게 유명하지 않았음.
8. 원래 느렸는데, 더빠르게 반드는 방법이 탄생 됨.

9. 데이터가 쭉 늘어진 파일이 아니다.

10. 데이터베이스를 연결관계로써, 교차지점으로써 이해하는 것이 중요하다.
11. 한 80%는 아주 빠른 엑셀로 이해할 수 있지만 20%의 차이가 크다.

12. 데이터베이스의 강력함은, 우리가 원하는 것을 위해 추상적인 표현이 가능하는 것이다.

13. 데이터베이스이 능력은 명령형 언어이다.

 

14. 명령만 내리면 컴퓨터가 최적의 경로로 그 명령을 어떻게든 수행한다.

15. 이 명령을 통해 CRUD(Create, Read, Updade, Delete)를 수행
16. 데이터베이스 관리자는 실제 서비스적인 측면을 맡고 있다.
17. 데이터베이스의 데이터 모델과 메타 데이터는 성능을 위해 아주 중요하다.

 

18. 회사마다 약간씩 다르기는 하지만 큰 차이는 아니다.

19. sqllite내장형 데이터 베이스 시스템이라고 불리며 애용된다.

Part 2

 

1. 데이터는 로우와 칼럼의 교차점이다
2. 데이터의 크기가 중소형이 넘어가면, 각각의 데이타 베이스를 최적화 시켜야 한다
3. 큰 그림을 그리고 기본 규칙을 정한다
4. 정규화에 대해 공부해도 좋다

 

5. 동일한 문자열 데이터를 중복하지 말라
6. 오직 일대일의 대응관계만 갖기 때의에 단 하나 데이터 만을 남겨야 한가
7. 중복을 배제하고 하나의 데이터만 남기며
8. 사용자가 있고 사용자의 이름이 있으면 사용자의 이름은 한 번만 보인다. 다른 것들은 사용자 이름를 가리킨다. 
9. 어떻게 수직으로 있는 데이터 중복을 없앨 수 있을까?

 

Work


1. 데이터베이스의 장점은 모든 실행마다 정보가 저장된다는 것이다.

...더보기

* SQL 주입

SQL 인젝션(SQL 삽입, SQL 주입으로도 불린다)은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다.
-나무위키-

 

import sqlite3

conn = sqlite3.connect('emaildb.sqlite') #connect를 통헤 접근가능한지 확인
cur = conn.cursor() # cursor를 통해 명령을 주고 결과를 받을 핸들 생성

cur.execute('DROP TABLE IF EXISTS Counts') #기존 테이블 삭제 명령

cur.execute('''
CREATE TABLE Counts (email TEXT, count INTEGER)''') #Counts라는 email TEXT, count INTEGER를 가진 테이블 생성

fname = input('Enter file name: ') #이메일이 입력 되면 그 값은 fname
if (len(fname) < 1): fname = 'mbox-short.txt' # fname이 입력되지 않어면 기본값 설정
fh = open(fname) #fname에 대한 핸들 fh
for line in fh: # fh원소에 대한 빈복문
    if not line.startswith('From: '): continue # fh의 원소 line이 'From'으로 시작되지 않는다면 다시 처음으로
    pieces = line.split() # line을 공백으로 자른 것을 pieces라고 저장
    email = pieces[1] # pieces의 2번째 원소를 email이라고 저장
    cur.execute('SELECT count FROM Counts WHERE email = ? ', (email,)) # ?가 들어가는 곳에 email값을 넣음 쉼표 다음에 값이 없는 것은, 값이 하나라는 튜플이라는
    row = cur.fetchone() #첫번째 레코드를 읽어들여 row에
    if row is None: # 만약 로우의 값이 없다면
        cur.execute('''INSERT INTO Counts (email, count)
                VALUES (?, 1)''', (email,)) # Counts 테이블에 (email, count) 튜플을 넣는다.방금 만들었으니 count는 1이 되어야 할 것이고, 이메일은 입력란 값이 된다. 다시 설명, ?는 튜플의 ? 자리에 특정 변수를 넣겠다라는 뜻.
    else:
        cur.execute('UPDATE Counts SET count = count + 1 WHERE email = ?',
                    (email,)) # 기존에 있던 이메일 주소에 대해서는 UPDATE를 이용해 수정하는데, 동시접근에 대해서도 걱정이 없다고 한다.(이부분 이해 x)
    conn.commit() # 커밋은 데이터를 저장하는 것이다. 저장 횟수를 지정가능하다.
# https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT email, count FROM Counts ORDER BY count DESC LIMIT 10'

for row in cur.execute(sqlstr): # cur를 이용하여 sqlstr를 각 로우에 대해 실행하고 출력
    print(str(row[0]), row[1])

cur.close() # 커넥션을 마무리함.

선생님 노트북은 바로 나오던데... 난 한참 걸렸다 ㅠㅜ