# database 폴더가 없다면 생성 ifnot os.path.isdir('database'): os.mkdir('database')
conn = None cur = None
defconn(): global conn, cur conn = sqlite3.connect('database/database.db') cur = conn.cursor() cur.execute('''CREATE TABLE IF NOT EXISTS todos( id INTEGER PRIMARY KEY AUTOINCREMENT, work TEXT, create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )''')
defclose(): global conn, cur conn.commit() cur.close() conn.close() cur = None conn = None
defget_todos(): global conn, cur conn() cur.execute(''' SEELCT * FROM todos; ''') data = cur.fetchall() close() return data
defget_todo(id): global conn, cur conn() cur.execute(f''' SELECT * FROM todos WHERE id = {id}; ''') data = cur.fetchone() close() return data
defpost_todo(work): global conn, cur conn() cur.execute(f""" INSERT INTO todos (work) VALUES ('{work}'); """) close()
defput_todo(id, work): global conn, cur conn() cur.execute(f""" UPDATE todos SET work = '{work}' WHERE id = {id}; """) close()
defdelete_todo(id): global conn, cur conn() cur.execute(f''' DELETE FROM todos WHERE id = {id}; ''') close()
ORM형식으로 짠 것이 아니라 그런지, 발생한 이슈는 Text타입일 때 Insert나 Update SQL Query에서 '싱글 쿼터나 더블 쿼터로 감싸주지 않아서 타입 오류가 발생하였다. 이에 대한 대응책도 하나 마련해야한다. 싱글 쿼터로 감싸주었는데 값에 싱글 쿼터가 있다면 SQL Injection이 발생하고 말 것이다. 여기에는 작성하지 않았지만, 이를 해결하기 위해서 python의 replace문을 사용할 수 있다.
@app.route('/') defhello(): name = request.args.get("name", "World") returnf'Hello, {escape(name)}!'
if __name__ == '__main__': app.run(debug=True)
테스트 해보던 중에 한가지 문제가 발생하였다. get으로 가져온 다음에 F5를 누르면 해당 값이 None이 되면서 TypeError을 발생하는 것이었다. 데이터베이스 구조에서 close를 해주기에 생기는 문제였는데, 이는 sqlite3에서 발생하였다. sqlite3는 동시성이 필요한 작업에서는 사용하지 않는 것이 좋다.
DB를 고려하지 않는다고 하였을 때도 새로운 문제가 발생한다. 다른 주소에서 접근을 할 수가 없는 문제있다. 이를 해결하기 위해서 CORS를 설정해주어야한다.