데이터베이스(db)/SQLite

[Python]flask와 sqlite(데이터베이스) 연결하고 웹화면에 띄우기

끄적끄적아무거나 2022. 11. 4. 08:47
반응형

 

목차

     

     

     

     

     

     

    파이썬 flask, SQLite 연결하기(기본 준비)

    앞서 시간에는 flask 사용 방법과 SQLite 사용 방법에 대해 살펴 보았습니다. 이번 포스트는 flask로 웹 서버(Web server)를 구동하고 해당 웹서버를 통해서 SQLite DB(Data base)에 접급하여 값을 불러오는(읽어오는) 방법에 대해 알아보겠습니다. 

     

    언제나 그렇듯이 코드는 최대한 단순하게 작성해서 어떻게 사용하는지에 대해서만 알아보겠습니다. 

     

    우선 코드를 실행하기 위해 아래와 같은 준비가 되어 있어야 합니다. 

     

     

    1. DB 파일 생성하기: 아래와 같이 employee라는 테이블(Table)로 SQLite Database를 형성합니다. 테이블 생성 및 값 넣는 방법은 https://scribblinganything.tistory.com/610 을 참조하시면 됩니다.

     

     

     

     

     

    2. 다음은 해당 DB 파일을 열어줄 web 파일이 필요 합니다. 해당 html 파일은 templates 폴더에 넣도록 합니다. 코드는 Jinja2 를 사용해서 flask에서 전달하는 값을 받았습니다.

     

     

    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>

     

     

     

     

     

     

    파이썬 flask, SQLite 연결하기(메인)

    DB파일과 Html 파일이 준비되면 파이썬(Python) 코드로 flask 를 작성해 줍니다. 

     

    메인코드>>

    from flask import Flask, render_template, abort
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\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_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, "페이지가 없습니다")
    
    @app.route('/')
    def hello_fnc():
        return "Hello"
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', debug=True, port=9999)

     

     

     

     

     

     

     

     

     

    코드 주석>>

    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\company.db'
    db = SQLAlchemy(app)

    Flask 객체를 생성하고 SQLite는 SQLAlchemy 라이브러리를 사용해서 연동해줍니다.

    그리고 DB의 위치는 \\ 을 두번 사용해서 절대 경로를 설정해줍니다. 해당 경로를 제가 윈도우 환경(Window OS)에서 운용하기 때문에 해당 경로로 설정 하였습니다. 

     

    다음 포스트에서는 라즈베리파이(Raspberry Pi)에서 리눅스 환경(Linux OS)에서 사용하는 방법에 대해 작성해보겠습니다. 

     

     

     

     

     

     

    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)

    DB와 동일한 구성으로 작성해서 DB를 작성하거나 불러올 때 사용 합니다.

     

     

     

     

     

     

    @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, "페이지가 없습니다")

    sql_read 페이지에 접속 했을 때 동작 합니다. 

    db.session.query를 사용해서 employee 테이블의 값을 모두 불러 옵니다.

     

     

     

     

     

     

    @app.route('/')
    def hello_fnc():
        return "Hello"

    flask가 정상적으로 동작하는 지 확인을 위해 사용 합니다.

     

     

     

     

    결과 확인>>

     

    파이썬 동작>>

     * Serving Flask app 'test00'
     * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on all addresses (0.0.0.0)
     * Running on http://127.0.0.1:9999
     * Running on http://192.168.0.111:9999
    Press CTRL+C to quit
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 137-591-160

     

     

    웹브라우져(Web Browser) 결과>>

     

     

     

    만일 DB 경로가 잘못되면 아래와 같이 Operational Error 에러가 발생하니 사용에 주의 하셔야 합니다.

     

    에러 메세지>>

    OperationalError
    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
    (Background on this error at: https://sqlalche.me/e/14/e3q8)

     

     

    반응형