Engineering Note

RDB와 Flask 본문

Server/Flask

RDB와 Flask

Software Engineer Kim 2021. 7. 18. 20:34

파이썬은 오픈소스와 상용 데이터베이스에 대한 대부분의 데이터베이스 엔진을 위한 패키지를 가지고 있습니다.
Flask에서 입력받은 내용을 DB에 저장할 수 있습니다.
효율적인 데이터 관리 가능

사용자 정보 검색

이번에서 실습한 내용을 이번 장에서는 DB를 연동하는 실습을 해보겠습니다.

  • 실습에 사용할 DB는 sqlite입니다. 실습을 시작하기에 앞서 import를 해줍니다.
    import sqlite3
    



* DB를 사용하기 위해서는 connect()를 한 상태에서 사용하고 사용이 끝나면 close()로 연결을 끊어줘야 합니다
```python
con =  sqlite3.connect('database.db')
con.execute('쿼리문')
con.commit()
con.close()
  • DB와 연결할 때 사용하는 객체를 생성하고 close()를 사용하는 게 번거롭다면 다음과 같은 방법으로도 사용 가능합니다.
    with sqlite3.connect("database.db") as con:
      con.execute("쿼리문")
      con.commit()
    

* 실습 코드
```python
conn = sqlite3.connect('database.db')
print ("Opened database successfully")

conn.execute('CREATE TABLE IF NOT EXISTS Board (name TEXT, context TEXT)')
print ("Table created successfully")

value = [['Elice', 15], ['Dodo', 16], ['Checher', 17], ['Queen', 18]]
for i in range(4):
    conn.execute(f"INSERT INTO Board(name, context) VALUES('{value[i][0]}', '{value[i][1]}')")
conn.commit()

conn.close()

실습 전체 코드 설명

  • 서버 실행시 DB 가 연결된다. 그리고 value에 저장된 데이터를 INSERT INTO 문을 통해 데이터 베이스에 저장한다.
  • ROOT URL에서 저장된 데이터를 보여주는 화면이 출력된다.
  • 검색 화면에서는 POST 방식으로 데이터를 전송해주면 서버에서는 아래와 같은 방식으로 데이터 베이스를 연겨하고 객체를 만들고 데이터를 조회한다. 그리고 rows 변수에 담아 search.html로 다시 return을 해준다.
@app.route('/search', methods = ['GET', 'POST'])
def search():
    if request.method == 'POST':
        print("hello")

        result = request.form['search']

        # 데이터베이스를 연결하세요.
        con = sqlite3.connect("database.db")

        # cursor 객체를 만드세요.
        cur = con.cursor()

        # Board 테이블에서 요청받은 result가 있는지 찾는 쿼리를 실행하세요.
        cur.execute(f"SELECT * FROM Board WHERE name='{result}' or context='{result}'")

        # 쿼리 실행 결과를 rows 변수에 저장하세요.
        rows = cur.fetchall()
        # DB의 연결을 해제하세요.
        con.close()

        print("DB:")
        for i in range(len(rows)):
            print(rows[i][0] + ':' + rows[i][1])

        return render_template('search.html', rows = rows)
    else:
        return render_template('search.html')

실습 전체 코드

from flask import Flask, render_template, request, url_for, redirect
import sqlite3

app = Flask(__name__)
conn = sqlite3.connect('database.db')
print ("Opened database successfully")
conn.execute('CREATE TABLE IF NOT EXISTS Board (name TEXT, context TEXT)')
print ("Table created successfully")
name = [['Elice', 15], ['Dodo', 16], ['Checher', 17], ['Queen', 18]]
for i in range(4):
    conn.execute(f"INSERT INTO Board(name, context) VALUES('{name[i][0]}', '{name[i][1]}')")
conn.commit()
conn.close()


@app.route('/')
def board():
    con = sqlite3.connect("database.db")
    cur = con.cursor()
    cur.execute("select * from Board")
    rows = cur.fetchall()
    print("DB:")
    for i in range(len(rows)):
            print(rows[i][0] + ':' + rows[i][1])
    return render_template('board.html', rows = rows)

@app.route('/search', methods = ['GET', 'POST'])
def search():
    if request.method == 'POST':
        search = request.form['search']
        con = sqlite3.connect("database.db")
        cur = con.cursor()
        cur.execute(f"SELECT * FROM Board WHERE name='{search}' or context='{search}'")
        rows = cur.fetchall()
        print("DB:")
        for i in range(len(rows)):
            print(rows[i][0] + ':' + rows[i][1])
        return render_template('search.html', rows = rows)
    else:
        return render_template('search.html', msg = "검색어를 입력해주세요.")

@app.route('/add', methods = ['GET', 'POST'])
def add():
    if request.method == 'POST':
        name = request.form['name']
        context = request.form['context']
        with sqlite3.connect("database.db") as con:
            cur = con.cursor()
            # name이 DB에 있는지 확인 후 사용자를 DB에 추가하세요.
                # dbname = cur.execute(f"SELECT name from Board WHERE name='{name}'")
            cur.execute(f"SELECT count('name') FROM Board WHERE name='{name}'")

            if cur.fetchall()[0][0] == 0:

                cur.execute(f"INSERT INTO Board (name, context) VALUES ('{name}', '{context}')")
                con.commit()
            else:
                # 중복 사용자인 경우 안내 메시지를 넘긴 후 add.html을 렌더링하세요.
                return render_template('add.html', msg = "중복 사용자입니다. 이름을 바꿔주세요.")

        return redirect(url_for('board'))
    else:
        return render_template('add.html')
if __name__ == '__main__':
    app.run(debug=True)

'Server > Flask' 카테고리의 다른 글

SQL Alchemy와 ORM  (0) 2021.07.18
JWT  (0) 2021.07.18
Flask 게시글 삭제  (0) 2021.07.18
Web-Backend 2  (0) 2021.07.18
Web-Backend  (0) 2021.07.15
Comments