[8일차] Flask, Sqlite
1. 학습내용
sqlite3 Database 만들기
glitch에서 sqlite 사용
sqlite tutorial 공식 홈페이지 참고 (https://www.sqlitetutorial.net/sqlite-commands/)
glitch terminal에서 'sqlite3'을 입력하면 sqlite을 사용할 수 있다.
sqlite3
.open 으로 파일을 만든다. 파일이름은 'db.split3'이다.
.open db.split3
topics 테이블을 만들고 id, title, body 컬럼을 만든다.
CREATE TABLE topics (id INTEGER PRIMARY KEY, title TEXT NOT NULL, body TEXT);
테이블을 만들고나서 .tables로 만들어진 테이블 목록을 확인할 수 있다.
.tables
topics 테이블의 schema를 확인한다.
.schema topics
id는 primary key로 만들었기 때문에 title과 body 데이터를 insert 한다.
INSERT INTO topics (title, body) VALUES ('sqlite', 'sqlite is..');
입력한 데이터를 확인해본다.
SELECT * FROM topics;
만약 테이블을 잘 못 만들었으면 DROP을 한다.
DROP TABLE topics;
topics 테이블의 데이터를 지울 때는 DELETE를 사용한다.
DELETE FROM topics WHERE id=2;
Python으로 Database 핸들링하기
- 'database' DB와 연결하고 topics 테이블의 모든 데이터를 select문으로 출력한다.
import sqlite3
con = sqlite3.connect('database')
cur = con.cursor()
cur.execute('SELECT * FROM topics')
topics = cur.fetchall()
print(topics)
- for문을 사용해서 컬럼별로 출력할 수도 있다.
import sqlite3
con = sqlite3.connect('database')
cur = con.cursor()
for row in cur.execute('SELECT * FROM topics'):
print(row)
Flask에서 Sqlite 사용하기
- template에서 db를 연결하고, select문으로 db의 내용을 list로 출력하는 코드
(변경된 부분만 추가)
def template(content, id=None):
conn = sqlite3.connect("test.db", isolation_level=None)
cs = conn.cursor()
cs.execute('SELECT * FROM topics')
topics = cs.fetchall()
conn.close()
liTags = ''
for topic in topics:
liTags = liTags + f'<li><a href="/read/{topic[0]}">{topic[1]}</a></li>'
- create form으로 추가한 다음 create_process에서 db로 insert한다.
추가한 다음 추가된 데이터의 가장 마지막 id의 read 페이지로 이동한다.
cursor에게 lastrow를 물어봐서 가져오는 걸로 한다.
@app.route('/create_process/', methods=['POST'])
def create_process():
conn = sqlite3.connect('test.db')
cs = conn.cursor()
# global nextId
getTitle = request.form['title']
getBody = request.form['body']
cs.execute('INSERT INTO topics (title, body) VALUES (?, ?)', (getTitle, getBody))
id = cs.lastrowid
conn.commit() # commit 전까지는 실제로 writing이 안 되고 있다.
conn.close()
return redirect(f'/read/{id}/')
- delete from으로 id를 매칭시켜서 삭제한다.
@app.route("/delete/<int:id>/", methods=['POST'])
def delete(id):
conn = sqlite3.connect('test.db')
cs = conn.cursor()
cs.execute('DELETE FROM topics WHERE id=?', (id,))
conn.commit()
conn.close()
return redirect('/')
2. 중요내용
- 추가, 수정, 삭제 시에는 connect.commit()을 해야 변경사항이 반영된다.
- SQL 쿼리문을 날릴 때 f-string이 아닌 매개변수를 튜플형식으로 날려야한다.
매개변수 1개 : 'DELETE FROM topics WHERE id=?', (id,)
1개일 때 ,가 추가되는 건 튜플형식으로 전달해야하기 때문이다.
매개변수 2개 : 'INSERT INTO topics (title, body) VALUES (?, ?)', (getTitle, getBody)
3. 학습소감
list를 써서 database처럼 흉내를 낼 수 있었지만,
페이지를 다시 켜면 날아가서 불편했던 것 외에도 다양한 부분에서
Database를 쓰면서 해결할 수 있었다.
Author And Source
이 문제에 관하여([8일차] Flask, Sqlite), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lnglog/8일차-Flask-Sqlite
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
- 추가, 수정, 삭제 시에는 connect.commit()을 해야 변경사항이 반영된다.
- SQL 쿼리문을 날릴 때 f-string이 아닌 매개변수를 튜플형식으로 날려야한다.
매개변수 1개 : 'DELETE FROM topics WHERE id=?', (id,)
1개일 때 ,가 추가되는 건 튜플형식으로 전달해야하기 때문이다.
매개변수 2개 : 'INSERT INTO topics (title, body) VALUES (?, ?)', (getTitle, getBody)
list를 써서 database처럼 흉내를 낼 수 있었지만,
페이지를 다시 켜면 날아가서 불편했던 것 외에도 다양한 부분에서
Database를 쓰면서 해결할 수 있었다.
Author And Source
이 문제에 관하여([8일차] Flask, Sqlite), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lnglog/8일차-Flask-Sqlite저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)