read.py
import sqlite3 #파이썬에 내장
conn = sqlite3.connect('db.sqlite3')
[form sqlite3 import connect
connect('db.sqlite3')]이런 식으로도 사용가능
curor = conn.cursor()
curor.execute('SELECT * FROM topics')
topics = curor.fetchall() #fetch 데이터 가져오기, fetchall 데이터 전부 가져오기
for topic in topics:
print(topic[0], topic[1])
conn.close()
python3 read.py
1 SQLite
복제 duplicate
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)) #?=title, ?=body 사용한 정보
conn.commit()
conn.close()
import read
excute - 읽기
commit - 수정, 추가, 삭제
get - url을 통해서 전송, 많이는 할 수 없음(한계 존재)
post - 한계가 없음
request.form 직전에 전송된 title 값 알아낼 수 있음
삭제도 변경이기 때문에 post방식
break 종료
return redirect('/') -> 홈 home
터미널
(데이터 베이스 -> 표들의 집합)
.open db.sqlite3 #파일생성
CREATE TABLE topic(
id INTIGER FRIMARY KEY,
title TIXT NOT NULL
body TIXT
); #;을 쓰기 전까지는 문장이 끝지 않음
schema topics
데이터 입력시,
INSERT INTO topics(title, body) VALUES('SQLite', 'SOLite is ...');
데이터 읽을 때,
SELECT*from topics;
삭제할 때,
DELETE FROM topics id=2;
.exit
server.py
from flask import Flask, request, redirect
import sqlite3
app = Flask(__name__)
topics = [
{"id":1, "title":"html", "body":"html is ...."},
{"id":2, "title":"css", "body":"css is ...."},
{"id":3, "title":"js", "body":"js is ...."}
]
def template(content, id=None):
contextUI = ''
if id != None:
contextUI = '<input type="submit" value="delete" class="btn btn-dark">'
conn = sqlite3.connect('db.sqlite3')
cs = conn.cursor() #()가 없으면 함수가 호출되지 않음
cs.execute('SELECT * FROM topics')
topics = cs.fetchall() #fetchone 한 건, fetchall 리스트 안안 한 건
conn.close()
liTags = '' #목록을 만드는 코드
for topic in topics:
liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'
return f''' #딕셔너리가 아니기에 색인을 적어줌
<html>
<head>
<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> #visual studio code에서는 h1{}으로 실행되지만 glitch에서는 h1{{}}으로 실행해야 한다.
h1{{
border-bottom:10px solid green;
}}
h1>a{{
text-decoration:none;
}}
</style>
</head>
<body class="container">
<input type="button" value="night" onclick="
document.querySelector('body').style.backgroundColor = 'black';
document.querySelector('body').style.color = 'white';
">
<h1><a href="/">WEB</a></h1>
<ol>
{liTags}
</ol>
{content}
<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>
</html>
'''
@app.route("/")
def index():
return template('<h2>Welcome</h2>Hello, WEB!')
@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/')
def create():
content = '''
<form action="/create_process/" method="POST">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit" value="create"></p>
</form>
'''
return template(content)
@app.route('/create_process/', methods=['POST'])
def create_process():
title = request.form['title'] #여기서 정한 title값이 뒤의 excute의 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() #수정, 삭제와 같은 작업을 할 때 사용, 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('/')
# # @app.route('/update/')
# # def update():
# # return 'Update'
app.run()
fetch, fetchone, fetchall의 차이를 완전히 이해하지 않을 상태에서 코드를 작성하다 오류가 나서 당황했다.
실행을 누르면 자꾸 오류가 나서 확인해 보면 여지없이 오타였고 오타를 고치다가 수업 참여가 더뎌졌다.
gliich에서 기존에 배운 것들을 응용해 css를 도입하는 과정에서 기억이 잘 나지 않아 당황했으며 막상 대입을 했으나 프로그램에서 수용을 하지 않아 당황했다.
먼저 fetch는 fetchone을 사용할 때에는 한 건, 그냥 한 건을 도출시키고자 할 때 사용하며 fetchall은 리스트 안의 모든 것을 도출시키고자 할 때 사용한다. 따라서 한건을 도출시켜야 할 때 fetchall을 사용하게 되면 모든 리스트에 대한 내용과 함께 하나의 값이 도출되며 fetchone을 사용하면 해당하는 한 건에 대한 내용만 도출된다.
플랫폼마다 도입되는 형태가 같지 않다는 점을 이번기회에 알게 되었다. 똑같은 코드를 넣어도 코드로 인식하지 않는 경우가 있으며 이 때에는 인터넷에 검색을 통해 방법을 찾아야 한다.
어쩌다 3월의 학습을 모두 수료하게 되었다. html, css, javascript, python 까지 평소라면 이름만 듣고 넘겼을 것들에 대해 기초적이지만 중요한 것들을 배울 수 있어 유익했다. 수업은 끝났지만 모든 수업이 다 내것으로 되지는 않았다. 앞서 들었던 것들이 다 기억나지 않기도 해서 추가적으로 틈틈이 복습을 하려 한다. 오늘의 수업은 앞서 배운 내용을 복합적으로, 또 심화적으로 수행했다. 아직 기초적인 내용이고 교육적인 내용이지만 무척 의미있었다.