[개발일지 2022.4.1] Python 파이썬 데이터베이스 python 연동2

1.학습한 내용

1) Terminal 로 DB 만들기

그전날 SQLite Studio 로 만들었던 데이터베이스를
Glitch 에 있는 Terminal 을 이용하여 만드는 것을 하게되었다.

Glitch.com -> TERMINAL

sqlite3

.open db.sqlite3

CREATE TABLE topics(
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
body TEXT
);

여기 까지하면 id,title,body 가 정해진 table 을 만들수있고.
이를
.schema topics
를 치는것으로 확인할수있다.

INSERT INTO topics (title,body) VALUES('SQLite','SQLite is ...');
의 코드를 실행함으로써
title 은 SQLite , body는 SQLite is ... 인 리스트를 table에 넣을수있다.

2) python 과 DB 연동

2-1) read 파일 작성

이제 리스트를 넣은 db를 확인을 해야하는데.
이를 python 을 이용하여 확인하고자
read.py 파일을 만들었다.

이때 sqlite3 는 파이썬 내부에 내장되어있기때문에

import sqlite3

를 입력하고. db.sqlite3 의 데이터를 읽고자 하는것이기 때문에

conn = sqlite3.connect('db.sqlite3')

의 코드를 추가한다.
그 후 이 코드를 작동시키기 위해서 커서를 만들고, 커서가 작동하고자 하는 내용을 만들어야한다.

cursor = conn.cursor()
cursor.execute('SELECT * FROM topics')
topics = cursor.fetchall()

그리고 이 작동한 내용을 출력하기 위해서 반복문으로

for topic in topics:
  print(topic[0], topic[1])

를 쓰는데, 이는 topic 만을 표기하기때문에 내용까지 확인하기 위해서 아래에 print(topics) 를 추가하였다.
그후 conn을 사용하는것이 끝났기 때문에

conn.close()

를 추가하면

import sqlite3
conn = sqlite3.connect('db.sqlite3')

# from sqlite3 import connect
# connect('db.sqlite3')

cursor =conn.cursor()
cursor.execute('SELECT * FROM topics')
topics = cursor.fetchall() 

for topic in topics:
  print(topic[0], topic[1])

print(topics)
conn.close()
  

전체적으로 이런 코드가 나오게 되고. 이를 terminal 에서 python3 read.py 를 동작시키면

위와 같은 값이 출력되는것을 알수있다.

2-2) create 파일 작성

또한 위에서 table 에 list를 추가하는것도 python 으로 가능한데.
read 때와 마찬가지로

import sqlite3
conn = sqlite3.connect('db.sqlite3')
cursor = conn.cursor()

까지 추가를 하고. 이 리스트의 내용을 입력해야 하기 때문에

title = input('title?')
body = input('body?')
cursor.execute('INSERT INTO topics(title,body) VALUES( ?,?)',(title,body))
topics = cursor.fetchall()

라는 코드를 씀으로써 title에 입력한 값과 body에 입력한 값이 각각
INSERT INTO topics() VALUES 의 형식에 들어가서
각자가 title 과 body 의 값으로 들어가고 동작한다.

또한 이 과정은 수정을 하는 과정이기때문에

conn.commit()

의 코드를 쓰고 전체적으로 끝났음을 알리는 conn.close() 를 추가하는것으로

import sqlite3
conn = sqlite3.connect('db.sqlite3')

# from sqlite3 import connect
# connect('db.sqlite3')

cursor =conn.cursor()
title = input('title?')
body = input('body?')
cursor.execute('INSERT INTO topics(title,body) VALUES(?,?)',(title,body))
topics = cursor.fetchall() 
conn.commit()
conn.close()

이러한 코드가 완성이 된다.
이것을 python3 create.py 를 작동하여도 table 에 list가 추가 되겠지만, 이를 입력하고 read.py를 작동시키는 과정을 생략하기위해서 가장 아랫줄에 import read 를 추가하고 동작시키면

그림과 같이 작동하는것을 알수있다.

2-3)기존의 python 코드와 연동하기

위의 코드들이 python 파일로 작동을 한것을 알수있듯이.
이는 이전 수업에서 작성했던 코드에서 list, dictionary 의 자리로써 적용될수있다는것을 알수있다.
이를 통하여 가장 먼저 sqlite3 를 import 하는 import sqlite3 를 입력한뒤.

Table

template 함수에서

conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('SELECT * FROM topics')
topics = cs.fetchall()
conn.close()

를 추가하게 되면 바로 동작을 할것같지만.
이것은 기존에 있었던 코드들과 충돌이 일어나게 되기때문에 오류가 일어난다.

그렇기 때문에 기존에 적용이 되던 topic에서 문자열로 사용했던 부분들을을 튜플(셀수있는 숫자)로 바꿔야하기 때문에

 for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}<a></li>'

기존에 'topic' 으로 표시하였던 부분들을 topic[0] , topic[1] 과 같이 수정을 해주어야 작동을한다. (id = 0, title = 1 , body = 2)

Read

list 가 적용이 된 table 을 표현하는 함수가 완성되었으면.
이를 읽어내는 함수 또한 필요한데. 기존의 read route 에서

conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
conn.close()

의 기본적인 코드를 추가한뒤 그 사이에

cs.execute('SELECT * FROM topics WHERE id=?',(id,))
  topic = cs.fetchone()

선택한 토픽의 id를 확인하는 과정을 거친다.
그 후 title과 body 를 표시하는 코드를 추가하면

@app.route("/read/<int:id>/")
def read(id):
  conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('SELECT * FROM topics WHERE id=?',(id,))
  topic = cs.fetchone()
  conn.close()
  title = topic[1]
  body = topic[2]
  return template(f'<h2>{title}</h2>{body}', id) 

위와 같은 route가 완성이 된다.

create

위에서 하였던 create 또한 python 내부에서 적용을 하게 되는데.
2-2 에서 만든 파일과 다르게 request 의 과정과 추가되는 id의 위치를 설정해 주어야한다.

@app.route('/create_process/', methods=["POST"])
def create_process():
  title=request.form['title']
  body=request.form['body']
  conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('INSERT INTO TOPICS (title,body) VALUES(?,?)',(title,body))
  id = cs.lastrowid
  conn.commit()
  conn.close()
  return redirect(f'/read/{id}/')

이때 lastrowid 는 마지막으로 추가되거나 변경된 레코드의 번호를 나타낸다.

delete

입력한 list를 table에서 삭제하는 delete 의 경우에는

conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('DELETE FROM topics WHERE id = ?',(id,))
  conn.commit()
  conn.close()

기존의 작동하는 코드를 가져오되 작동하는 execute 의 내용이 달라지는데
topics 에서 선택한 id번째를 삭제한다.

※이때 중요한점은 WHERE 이라는 글자가 빠질경우 원하는 항목이 아닌 모두가 사라질수 있기 때문에 반드시 필요하고 중요하다.

2.학습내용 중 어려웠던 점

수업을 하는 과정에서 TERMINAL 을 사용할때. sqlite3 파일의 경우 파일로써 존재하는게 아니라 데이터로써 존재하기 때문에 오타가 생기거나 잘못된 정보가 추가되었을때 수정하는것이 매우 어려웠다.

3.해결방법

결국 데이터파일 자체를 지우고 새로 만드는 방법으로 해결을 하게되었는데, 이 파일을 지우고 다시 작성하는 과정에서 시간이 소요되어서 수업의 호흡을 따라가는것이 어려웠지만, 했던 것을 다시 시도해보고, 실수한것을 다시 해보는 과정에서 그냥 지나치면서 이해하기 어려웠던것을 다시 이해하는 기회가 될수있었다.

4.학습소감

Egoing 강사님의 수업은 오늘로 끝이 났지만, html,css,js 등 웹개발에 관해서 전혀 모르던 나에게 복잡한 내용들을 정리해서 강의해주신 덕분에 그 전보다 훨씬 많은 지식과 기술을 배웠다는 느낌을 가질수 있어서 보람차다.
이번 강의가 끝났다고 끝을 내는것이 아니라, 배운 수업들을 자주 복습하는것으로 익숙하지 않은 이 기술들을 익숙해지기 위해 노력할것이다.

좋은 웹페이지 즐겨찾기