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;
import sqlite3
con = sqlite3.connect('database')
cur = con.cursor()
cur.execute('SELECT * FROM topics')
topics = cur.fetchall()
print(topics)
import sqlite3
con = sqlite3.connect('database')
cur = con.cursor()
for row in cur.execute('SELECT * FROM topics'):
print(row)
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>'
@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}/')
@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('/')
- 추가, 수정, 삭제 시에는 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를 쓰면서 해결할 수 있었다.