[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를 쓰면서 해결할 수 있었다.

좋은 웹페이지 즐겨찾기