이번 강좌에서는 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>
<결과>
~~끝~~
'Programming > Python_Web' 카테고리의 다른 글
Flask강좌6 - 등록/로그인/로그아웃 (0) | 2020.12.04 |
---|---|
Flask강좌5 - Flask form입력 (0) | 2020.12.03 |
Flask강좌3 - Request (0) | 2020.12.01 |
Flask강좌2 - Global Object: g, Response객체 (0) | 2020.12.01 |
Flask강좌1 - hello flask! (0) | 2020.12.01 |