<--SyntaxHighlighter--> SyntaxHighlighter.all();

이번 강좌에서는 ORM 방식으로 Database와 연동하는 방법에 대해 포스팅하겠습니다. ORM은 Object-Relational Mapping 이라고 하여, Database 객체를 객체지향 프로그래밍 언어로 변환하는 기법입니다. (자세한 내용은 다른 포스팅들을 참조하시기 바랍니다.) 그 중에서도 Flask에서 ORM을 구현할 수 있게 해주는 라이브러리가 Flask-SQLAlchemy 입니다. 이 Flask-SQLAlchemy를 이용하여 MySql과 연동해보도록 하겠습니다.

 

1. Database 자료 생성

아래와 같이 id, name, email, phone, start(datetime), end(datetime)을 필드로 하는 자료를 생성해놓습니다.

2. 라이브러리 설치

먼저 말했듯이 이번 강좌의 메인인 flask_sqlalchemy 라이브러리를 설치합니다. 그리고 mysql과 연동하기 위한 pymysql라이브러리도 함께 설치해줍니다.

pip install flask_sqlalchemy
pip install pymysql

 

3. 앱 구성

이번 helloflask앱은 아래와 같은 구성으로 만들려고 합니다. DB연동은 __init__.py에서 구현하고 db.html에서 결과를 표시합니다.

 

3. model.py

연결된 Database의 table을 받아들일 class를 정의합니다.

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()

class Members(db.Model):
    """ table name : members
        table info 
    - id : index id 
    - name 
    - start: start datetime
    - end: end datetime """
    
    __tablename__ = 'members'
    
    id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True)
    name = db.Column(db.String(20, 'utf8mb4_unicode_ci'))
    email = db.Column(db.String(50, 'utf8mb4_unicode_ci'))
    phone = db.Column(db.String(20, 'utf8mb4_unicode_ci'))
    start = db.Column(db.DateTime, default=datetime.utcnow())
    end = db.Column(db.DateTime, default=datetime.utcnow())

    def __init__(self, name, email, phone, start, end):
        self.name = name
        self.email = email
        self.phone = phone
        self.start = start
        self.end = end

4. __init__.py

예제 구성을 단순화하기 위해 database설정부분을 __init__.py 파일 안에 포함시켰습니다. 본인의 Database/ID/Password 등에 맞게 설정을 하시면 됩니다. one만 출력할 때에는 string을 return시켰으며, all을 출력할 때에는 db.html에 출력하도록 구성하였습니다.

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from helloflask.model.user_model import Members

app = Flask(__name__)

# database 설정파일
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:1234@localhost:3306/testdb"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)

@app.route('/home')
def home():
    return render_template('home.html')
    
@app.route("/one")
def home():
	member = Members.query.first()
	return 'Hello {0}, {1}, {2}, {3}, {4}'\
		.format(member.name, member.email, member.phone, member.start.isoformat(), member.end.isoformat())
	#return render_template('home.html')
    
@app.route('/all')
def select_all():
    members = Members.query.all()
    return render_template('db.html', members=members)

5. db.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<table>
{% for member in members %}
    <tr>
        <td>{{ member.id }}</td>
        <td>{{ member.name }}</td>
        <td>{{ member.email }}</td>
        <td>{{ member.phone }}</td>
        <td>{{ member.start }}</td>
        <td>{{ member.end }}</td>
    </tr>
{% endfor %}
</table>

</body>
</html>

<결과>

 

~~끝~~

  1. 2021.03.05 01:27

    비밀댓글입니다

    • 미니멀리 2021.03.05 05:34 신고

      지금 쓰고있는 툴은 Dbeaver라는 툴입니다. 오픈소스 프로그램인데 꽤 유명하고 기능도 괜찮은걸로 알려져있어요^^

  2. 2021.07.16 14:08

    비밀댓글입니다

    • 미니멀리 2021.07.22 22:51 신고

      제 코드에 오류가 있네요
      __init__.py 에서
      from helloflask.model import Members 부분을
      from helloflask.model.user_model import Member 로 바꿔야 합니다. 구성을 제것과 동일하게 구성했다고 가정할 때 폴더명model과 하위의 파일명 user_model이 각각 임포트 모듈 경로로 인식됩니다.
      그리고 mysql연결부분은 제것과 동일하세요. 저도 localhost에 계정은 root로 연결합니다. mysql+pymysql://root:1234@localhost:3306/members 부분에서 1234는 비밀번호인데, 님께서 설정한 비밀번호를 넣어주는 부분입니다.

+ Recent posts