Glitch에서 sever.py 페이지>터미널 클릭
1. sqlite3 입력 엔터
2. .open db sqlite3 입력 엔터(이제 모든 명령이 db.sqlite3에 저장된다)
3. 표 만들기 ➪ CREAT TABLE topics ( 입력
4. id INTEGER PRIMARY KEY, 입력
5. title TEXT NOT NULL, 입력
6. body TEXT
7. )
8. ; 입력 후 엔터
이렇게 하면 성공
확인 방법
.tables 입력 엔터 했을 때 topics가 출력되면 OK.
Creata문 확인 ➪ .schema topics 입력 엔터
INSERT INTO topics (id,title,body) VALUE('SQLite', 'SQLite is...'); 엔터
id는 생략해도 된다. INTEGER PRIMARY KEY이기 때문에 자동으로 1씩 증가하기 때문에.
데이터를 읽을 때는 데이터를 선택한다는 의미로 SELECT 사용
SELECT * FROM topics; 입력 후 엔터
우리가 입력한 데이터가 나온다.
데이터 읽기
Glitch에서 새 파일 생성>read.py
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 파일 복제>create.py이름 변경
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
타이틀에 사용자가 입력한 데이터가 corsor.execute 마지막 괄호 안 title로 가고 그게 VALUES 첫번째 물음표에 들어가. 바디도 동일 경로
코드와 보안에 도움이 된다.
생성, 수정, 삭제 작업을 하면
sever.py 페이지에 import sqlite3 입력
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor()
cs.execute('SELECT * FROM topics')
topics = cs.fetchall()
conn.close()
print('topics',topics)
liTags = ''
for topic in topics:
liTags = liTags + f'<li><a href ="/read/{topic[0]}/">{topic[1]}</a></li>'
db.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()
conn.close()
title = topic[1]
body = topic[2]
return template(f'<h2>{title}</h2>{body}', 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}/')
데이터베이스 삭제 기능 연결
@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('/')
삭제문에서 WHERE 빠르지말기!! 데이터 다 지워진다.
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<style>
h1{{
border-bottom:1px solid black;
}}
h1>a{{
text-decoration:none;
}}
</style>
부트스트랩 CSS, JavaScropt 코드 입력
버튼 변경, 합체
<form action="/delete/{id}/" method="POST">
<div class="btn-group" role="group" aria-label="Basic example">
<a href="/create/" class="btn btn-dark">create</a>
{contextUI}
</div>
</form>
다크모드 버튼 생성
<body class="container">
<input type="button" value="night" onclick="
document.querySelector('body').style.backgroundColor = 'black';
document.querySelector('body').style.color = 'white';
">
홈 페이지 삭제버튼 제외하기
contextUI = ''
if id != None:
contextUI = '<input type="submit" value="delete" class="btn btn-dark">'
만약 id가 None랑 같지 않다면, delete버튼 내용인 contextUI를 실행해.
✏️ 어떻게 해결을 했는가?
1. 질문으로 화면공유, 오타 확인과 선생님이 직접 확인해주셨다.
2. 강의를 다시 보면서 벨로그를 작성했고, 한문장 한문장 의미를 해석하며 정리하다보니 index값이 0과 1이 아니라 1과 2인 이유를 이해함
✏️ 이렇게 이해를 했다
✏️ 어디까지 이해했지?
데이터베이스 파일을 생성하고 확인하는 방법, 데이터베이스를 읽기, 데이터베이스에 새로운 데이터를 생성하고 확인하는 방법, Python에서 SQLite 목록, 생성, 삭제 정보 연동하기, 부트스트랩 사용해서 홈페이지 디자인
✏️ 다음에 시도해볼 방법
강의를 한문장 한문장 다시 들어보면서 반복해서 혼자 실습하기
매번 느끼지만 처음 듣는 정보를 들으려는 마음, 실습을 따라가는 손으로 급하게 임하니 오타가 많고 중간에 놓치는 부분이 있으며 이해가 되지 않는 것 같다. 오늘 새로운 접근으로 학습 내용을 정리해보니 내가 이해하지 못했던 부분과 코드 작성 이유가 조금씩 보이기 시작했다. 앞으로 강의를 천천히 곱씹으면서 이해와 익숙해지기 위해 반복하는 시간을 가져야겠다. 그리고 훨씬 효율적인 페이지가 작동되는 것을 보니 마음이 신난다.