일단 어제의 설명 중 하나를 정정하는데 데이터베이스는 파이썬과 별개로 돌아가는 것도 있지만 대체적으로 서로 다르게 돌아가는 종류도 많지만 SQLite는 무려 python 안에 내장되어 있다고 한다.
어제는 직접 SQLite3 프로그램을 다루어서 특별히 코드가 없기에 설명을 하지 않았는데 파이썬에 sqlite3가 내장되어있기 때문에 코드로 구현이 가능하다.
일단 파이썬 파일을 두개를 만든다. (각각 create.py, read.py) 그리고 먼저 터미널에서'sqlite3 db.sqlite' 로 sqlite3를 열어 db.sqlite를 만들고
'CREATE TABLE topics (
...> id INTEGER PRIMARY KEY,
...> title TEXT NOT NULL,
...> body TEXT
...> );'
를 통하여 테이블을 만든다.
import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
title = input('title? ')
body = input('body? ')
curor.execute('INSERT INTO topics (title, body) VALUES(?, ?)', (title, body))
conn.commit()
conn.close()
import read
create.py를 실행시키면 title과 body를 순서대로 묻게 되는데 이때 각각의 값을 입력하면 id값은 primary로 고유숫자가 하나씩 자동으로 부여되기 때문에 입력을 안해도 되고 title과 body에 각각 입력이 된다.
import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
curor.execute('SELECT * FROM topics')
topics = curor.fetchall()
for topic in topics:
print(topic[0], topic[1])
conn.close()
read.py를 실행시키면 이름그대로 테이블에 있는 데이터를 가지고 오는 역활을 한다.
연결과 커서를 정의한 다음 title과 body에 값을 입력할 수 있게 만들고 execute를 통해서 데이터를 입력 코드를 넣는다. commit은 데이터를 바꾸고 저장한다. fetch의 뒤에는 one이나all등이 오는데 all은 모든 것을 one은 단일 정보를 반환하거나 데이터가 없으면 None을 반환하게 된다.
그리고 중요한데 연결을 항상 닫아야한다.(아니면 서버에 무리가 가서 프로그램이 터진다.)
이렇게 배운 sqlite3의 코드를 이용해서
@app.route("/read/<int:id>/")
def read(id):
title = ''
body = ''
for topic in topics :
if topic['id'] == id:
title = topic['title']
body = topic['body']
break;
return template(f'<h2>{title}</h2>{body}')
의 for반복문을 sqlite3이 대신 수행하게 만들 수 가 있다.
@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()
title = topic[1]
body = topic[2]
conn.close()
return template(f'<h2>{title}</h2>{body}',id)
여기서 중요한점이 cs.execute('SELECT * FROM ... WHERE id=?',(id,))에서 id값을 가지고 오고싶기 때문에 WHERE를 써서 보다 정확한 개체를 가져오는 것이 가능하다.
비슷한 원리로
@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}/')
@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('DELETE FROM topics WHERE id = ?',(id,))
conn.commit()
conn.close()
return redirect('/')
위의 create.py를 앱으로 만든 create_process와 delete 버튼이다.
create_process에서는 id값이 지정이 안되어 있기에 마지막 행의 값을 주는 lastrowid라는 명령어를 사용했다.
오늘로 기본적인 코딩 수업이 끝났다. 어제와 비슷하게 만만치 않은 새로운 정보와 도구들을 얻었고 앞으로 웹에 대한 기본적인 것은 건들지 않을테니 일단 머릿속에 정리해 놓은 것이라도 잘 기억하도록 연습도 가끔해야겟다.