flask에 SQL DB 연동

김치성·2022년 4월 1일
0

학습내용

  1. 파이썬에서 sqlite3를 사용하여 쿼리문 작성
  2. flask에서 DB 연동해서 리스트 관리

1. 파이썬에서 sqlite3 를 사용하여 쿼리문 작성

import sqlite3
conn = sqlite3.connect('topics.sqlite3')
cursor = conn.cursor()
cursor.execute('SELECT * FROM topics')
topics = cursor.fetchall()
for topic in topics:
  print(topic[1], topic[2])
conn.close()

파이썬에는 기본적으로 sqlite3 패키지가 내장되어 있다.
따라서 sqlite3를 사용하고 싶을 경우 import를 하여 바로 사용하면 된다.
connect, cursor, execute 를 사용하여 연결, 준비, 실행 한다고 생각하면 된다.

모든 쿼리문은 execute 변수로 문자열로 작성하면된다.
SELECT 문을 실행한 결과 불러온 행들을 변수에 저장하기 위해선 fetchall이라는 함수를 사용한다.
만약 행이 하나라면 fetchone을 사용하면된다.
차이점은 fetchall을 할경우 리스트로 행들을 가져오게되고 fetchone을 할경우 튜플로 행을 하나 가지고 온다.
마지막으로 DB 관련 작업이 끝난 경우에는 필히 close를 하여 연결을 끊어준다.
DB 관리 모듈에 따라 다르긴 하나 혹시 모를 문제를 일으킬 수 있기에 꼭 끊어준다.

2. flask에서 DB 연동해서 리스트 관리

리스트 표출

  conn = sqlite3.connect('topics.sqlite3')
  cursor = conn.cursor()
  cursor.execute('SELECT * FROM topics')
  topics = cursor.fetchall()
  conn.close()
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'

DB에 저장된 값을 SELECT문을 사용하여 불러온 후 차례로 li 테그로 추가하여 DB 값을 웹화면에 표출한다.

POST로 받은 값을 DB에 저장

@app.route('/create_process/', methods=['POST'])
def create_process():
  title = request.form['title']
  body = request.form['body']
  conn = sqlite3.connect('topics.sqlite3')
  cursor = conn.cursor()
  cursor.execute('INSERT INTO topics (title, body) VALUES (?,?)',(title,body))
  id = cursor.lastrowid
  conn.commit()
  conn.close()
  return redirect(f'/read/{id}/')

form으로 POST 방식으로 submit 하였을때 이를 처리하는 라우터에서 request로 form 값을 불러와서 이를 DB에 저장하는 코드이다.
INSERT 쿼리를 실행하는거 까지는 위의 SELECT 쿼리를 실행하는 것과 같은 순서로 작성하고 다른 점은 마지막에 commit을 하는 것이다.
최종적으로 commit을 해야 실행한 결과를 적용한다.

이때, execute 를 사용하여 쿼리문을 작성할때 values 안에 값들을 튜플을 사용하여 추가적인 변수로 넣을 수 있다.
위 코드를 보면 'VALUES (?, ?)' 로 작성되었고 뒤에 추가 변수로 튜플형식으로 (title, body)가 입력된 것을 알 수있다.
꼭 튜플형식으로 넣어야 한다.

POST로 받은 값을 DB에서 삭제

@app.route('/delete/<int:id>/', methods = ['POST'])
def delete(id):
  if id != None:
    conn = sqlite3.connect('topics.sqlite3')
    cursor = conn.cursor()
    cursor.execute('DELETE FROM topics WHERE id=?',(id,))
    conn.commit()
    conn.close()
  return redirect('/')

DB에 저장할 때와 동일한 형식에 쿼리문만 바꿔주면 된다.
DELETE 문을 사용할때는 WHERE을 꼭 사용해서 전체 DB가 삭제되는 것을 주의하여야 한다.
또한 execute 문 사용시 ? 값에 들어갈 변수가 하나일 경우라도 튜플형식으로 넣어야 되기 때문에 (id,) 콤마를 넣어 튜플형식으로 만들어 줘야한다.

마치며..

  • 어려웠던점
    - 마지막 수업이고 전체적인 복습을 하였기에 어려운 점은 딱히 없었다.
  • 해결 방법
  • - ..
  • 소감
  • - 특히 마지막 수업이였기에 하나의 나름 완성된 프로젝트를 경험 할 수 있어서 뿌듯하였다.
    기존에 웹 개발 지식이 부족했는데 많은 지식과 노하우를 빠른 시일내에 배울 수 있게 된거 같아 아주 만족스럽다.
    profile
    디지털백수

    0개의 댓글