데이터베이스(db)/SQLite

[Python] flask와 sqlite 연동, 웹에 글 쓰고 데이터베이스에 넣기(GET, POST, form)

끄적끄적아무거나 2022. 11. 9. 09:17
반응형

 

목차

     

     

     

     

     

     

     

    [Python] flask와 sqlite 연동: Database Write 하기: 예제1

     

    혹시 전체 코드에 대해 자세히 알고 싶으시면 sqlite 카테고리의 글을 처음부터 보시면 쉽게 따라 오실 수 있습니다.

     

    앞서 포스트에서는 flask와 sqlite를 연동해서 데이터베이스의 값을 읽어 오거나 HTTP GET을 사용해서 특정 ID의 DB값을 읽어 오는 방법에 대해 알아 보았습니다(https://scribblinganything.tistory.com/623).

     

    이번 포스트에서는 두가지 예제에 대해 실행하겠습니다.

     

    • 특정 페이지 접속 시 파이썬 코드에 저장되어 있는 리스트 값을 데이터베이스에 올리기
    • 웹페이지에 직접 데이터베이스에 올릴 값 입력해서 flask와 sqlite 연동으로 DB에 저장하기

     

    우선 첫번째 예제의 전체 코드는 아래와 같습니다. 

     

     

     

    현재 employee 데이터 베이스에 저장된 DB 내용>>

     

     

     

    sql_read.html>>

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>sql_read</title>
    </head>
    <body>
        <table border="1"> 
            <tr>
                <th>ID</th>
                <th>이름</th>
                <th>주소</th>
            </tr>
            {% for item in items %}
            <tr>
                <td>{{ item.id }}</td>
                <td>{{ item.name }}</td>
                <td>{{ item.addr }}</td>
            </tr>
            {% endfor %}
        </table>    
    </body>
    </html>

     

     

    파이썬 메인 코드>>

    from flask import Flask, render_template, abort, redirect, url_for, flash
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\company.db'
    app.config['SECRET_KEY'] = "my_secret"
    # app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////home/fam/linux_test/flask_test/company.db'
    db = SQLAlchemy(app)
    
    class employee(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String, unique=True, nullable=False)
        addr = db.Column(db.String)
    
        def __init__(self, id=1, name=None, addr=None):
            self.id = id
            self.name = name
            self.addr = addr
    
        def __repr__(self):
            return '<%r, %r>' % (self.name,self.addr)
    
    @app.route('/sql_search/<id>')
    def sql_search(id):
        db_value = db.session.execute("SELECT * from employee where id like "+"'%"+id+"%'").fetchall() 
        if db_value:
            return render_template('sql_read.html', items=db_value)
        return abort(404, "no database") 
    
    @app.route('/sql_read')
    def sql_read():
        db_value = db.session.query(employee).all()
        if db_value:
            return render_template('sql_read.html', items=db_value)
        return abort(404, "no database")   
    
    @app.route('/sql_write')
    def insert_one():  
        new_data = employee(9,'Shawn', 'Chicago')
    
        db.session.add(new_data)
        db.session.commit()    
        flash('DB is saved')
        return redirect(url_for('sql_read'))
    
    @app.route('/')
    def hello_fnc():
        return "Hello"
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', debug=True, port=9999)

     

     

     

     

    이전과 동일한 내용의 코드에 대한 설명은 생략 하겠습니다.

    @app.route('/sql_write')
    def insert_one():  
        new_data = employee(9,'Shawn', 'Chicago')
    
        db.session.add(new_data)
        db.session.commit()    
        flash('DB is saved')
        return redirect(url_for('sql_read'))

    기존의 코드에서 위의 내용이 저장되었습니다. 

    1번 라인: sql_write 페이지에 접속시 아래의 함수가 실행됩니다.

    3번 라인: 저장할 리스트(list) 값을 employee 클래스(Class) 안에 넣어 줍니다.

    5~6번 라인: 데이터를 DB에 추가 해줍니다.

    8번 라인: 추가 결과를 sql_read.html에서 보여 줍니다.

     

     

     

    결과>>

    sql_write 접속 후 위와 같은 페이지와 데이터가 추가된 것을 확인할 수 있습니다.

     

     

     

     

     

     

     

    [Python] flask와 sqlite 연동: Database Write 하기: 예제2

     

    이번에는 웹페이지에서 직접 데이터베이스(Database)로 값을 입력하는 방법에 대해 알아보겠습니다.

     

    sql_write.html>>

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>sql_write</title>
    </head>
    <body>
        {%- for category, message in get_flashed_messages(with_categories = true) %}
            <div class = "alert alert-danger">
                {{ message }}
            </div>
        {%- endfor %}    
        <form action = "{{ request.path }}" method = "post">
            <label for = "id">id</label><br>
            <input type = "text" name = "id" placeholder = "id" /><br>        
            <label for = "name">name</label><br>
            <input type = "text" name = "name" placeholder = "name" /><br>
            <label for = "addr">addr</label><br>
            <textarea name = "addr" placeholder = "addr"></textarea><br>
            <input type = "submit" value = "Submit" />
        </form>    
    </body>
    </html>

    DB 값을 HTTP POST로 전달 받을 수 있게 form을 작성 해줍니다.

     

     

     

    파이썬 메인 코드>>

    from flask import Flask, render_template, abort, redirect, url_for, flash, request
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\company.db'
    # app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////home/fam/linux_test/flask_test/company.db'
    app.config['SECRET_KEY'] = "my_secret"
    db = SQLAlchemy(app)
    
    class employee(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String, unique=True, nullable=False)
        addr = db.Column(db.String)
    
        def __init__(self, id=1, name=None, addr=None):
            self.id = id
            self.name = name
            self.addr = addr
    
        def __repr__(self):
            return '<%r, %r>' % (self.name,self.addr)
    
    @app.route('/sql_search/<id>')
    def sql_search(id):
        db_value = db.session.execute("SELECT * from employee where id like "+"'%"+id+"%'").fetchall() 
        if db_value:
            return render_template('sql_read.html', items=db_value)
        return abort(404, "no database") 
    
    @app.route('/sql_read')
    def sql_read():
        db_value = db.session.query(employee).all()
        if db_value:
            return render_template('sql_read.html', items=db_value)
        return abort(404, "no database")   
    
    @app.route('/sql_write', methods = ['GET', 'POST'])
    def insert_one(): 
        if request.method == 'POST': 
            if not request.form['id'] or not request.form['name'] or not request.form['addr']:
                flash('Fill up the form', 'error')
            else:        
                new_data = employee(int(request.form['id']),request.form['name'],request.form['addr'])
                db.session.add(new_data)
                db.session.commit()    
                flash('DB is saved')
                return redirect(url_for('sql_read'))
        return render_template('sql_write.html')
    
    @app.route('/')
    def hello_fnc():
        return "Hello"
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', debug=True, port=9999)

     

     

     

    추가된 코드는 아래와 같습니다.

    @app.route('/sql_write', methods = ['GET', 'POST'])
    def insert_one(): 
        if request.method == 'POST': 
            if not request.form['id'] or not request.form['name'] or not request.form['addr']:
                flash('Fill up the form', 'error')
            else:        
                new_data = employee(int(request.form['id']),request.form['name'],request.form['addr'])
                db.session.add(new_data)
                db.session.commit()    
                flash('DB is saved')
                return redirect(url_for('sql_read'))
        return render_template('sql_write.html')

    1번 라인: sql_write에 접속하고 HTTP method가 GET이거나 POST일때 아래 함수를 실행합니다.

    3~11번 라인: POST일 경우 form으로 부터 값을 전달 받아서 데이터베이스에 저장하고 sql_read 페이지로 넘어 갑니다.

    12번 라인: GET인 경우 sql_write.html 페이지를 열어 줍니다.

     

     

     

     

     

     

     

     

    결과>>

    id는 10로 name은 Harry로 addr는 Texas로 입력하고 submit 버튼을 눌러 줍니다.

     

     

    정상적으로 값이 출력 됨을 알 수 있습니다.

    반응형