English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Flask 웹 애플리케이션에서 원시 SQL을 사용하여 데이터베이스에 CRUD 작업을 수행하는 것은 지루할 수 있습니다. 대신, Python 패키지인 SQLAlchemy는 강력한 OR 맵핑기로, 애플리케이션 개발자에게 SQL의 모든 기능과 유연성을 제공합니다. Flask-SQLAlchemy는 Flask 확장으로, Flask 애플리케이션에 SQLAlchemy 지원을 추가합니다.
ORM(객체 관계 맵핑)이 무엇인가요?
대부분의 프로그래밍 언어 플랫폼은 객체 지향적입니다. 반면에, RDBMS 서버의 데이터는 테이블 형태로 저장됩니다. 객체 관계 맵핑은 객체 매개변수를 기본 RDBMS 테이블 구조에 매핑하는 기술입니다. ORM API는 원시 SQL 문장을 작성하지 않고 CRUD 작업을 수행하는 방법을 제공합니다.
이 장에서는 Flask를 사용하는 방법을 배웁니다.-SQLAlchemy의 ORM 기술을 사용하여 작은 웹 애플리케이션을 구축합니다。
차1단계 - Flask 설치-SQLAlchemy 확장。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 pip install flask-sqlalchemy
차2단계 - SQLAlchemy 클래스를 이 모듈에서 가져오는 것이 필요합니다.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
차3단계 - 지금부터 Flask 애플리케이션 객체를 생성하고 사용할 데이터베이스의 URI를 설정합니다.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
차4단계 - 그런 다음, 애플리케이션 객체를 파라미터로 사용하여 SQLAlchemy 클래스의 객체를 생성합니다. 이 객체는 ORM 작업의 보조 함수를 포함하고 있으며, 사용자 정의 모델을 선언하는 부모 모델 클래스를 제공합니다. 아래 코드 부분에서 학생 모델을 생성했습니다.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 db = SQLAlchemy(app) class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10)) def __init__(self, name, city, addr, pin): self.name = name self.city = city self.addr = addr self.pin = pin
차5단계 - 만들기 위해/提及의 URI에서 사용할 데이터베이스를 사용하여 create_all() 메서드를 실행하세요.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 db.create_all()
SQLAlchemy의 세션 객체는 ORM 객체의 모든 영구성 작업을 관리합니다.
다음 세션 메서드는 CRUD 작업을 수행합니다 -
db.session.add(모델 객체) - 하나의 기록을 맵핑 테이블에 삽입합니다 db.session.delete(모델 객체) - 테이블에서 기록을 제거합니다 model.query.all() - 테이블에서 모든 기록을 검색합니다(SELECT 쿼리에 해당).
filter 속성을 사용하여 검색된 기록 집합에 필터를 적용할 수 있습니다. 예를 들어, students 테이블에서 city = 'Haikou'인 기록을 검색하려면 다음 명령어를 사용합니다 -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 Students.query.filter_by(city = 'Haikou').all()
이렇게 많은 배경 지식을 가지고 있으면서, 지금부터 우리의 애플리케이션에 데이터를 추가하기 위한 뷰 함수를 제공하겠습니다.
애플리케이션의 진입점은 URL에 바인딩된 ‘/‘의 show_all() 함수. 학생의 기록 집합을 파라미터로 템플릿에 전달합니다. 템플릿에서 서버 측 코드는 HTML 테이블 형식으로 기록을 표시합니다.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 @app.route('/) def show_all(): return render_template('show_all.html', students = students.query.all())
템플릿의 HTML 스크립트( show_all.html)이렇게 -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask 예제</title> </head> <body> <h3> <a href="{{ url_for('show_all') }}">학생 목록 - Flask SQLAlchemy 예제/a> </h3> <hr/> {%- for message in get_flashed_messages() %} {{ message }} {%- endfor %} <h3>학생 (<a href="{{ url_for('new') }}">추가 </a>)/h3> <table> <thead> <tr> <th>이름</th>/th> <th>도시</th>/th> <th>지역</th>/th> <th>Pin</th>/th> </tr> </thead> <tbody> {% for student in students %} <tr> <td>{{ student.name }}</td>/td> <td>{{ student.city }}</td>/td> <td>{{ student.addr }}</td>/td> <td>{{ student.pin }}</}}/td> </tr> {% endfor %} </tbody> </table> </body> </html>
위 페이지에는 URL로 가는 링크가 포함되어 있습니다:/new 映射 new() 함수의 링크. 클릭하면 학생 정보 폼이 엽니다. 데이터는 같은 URL에 POST 메서드로 전송됩니다.
템플릿 파일: new.html 의 코드는 다음과 같습니다 -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask 예제</title> </head> <body> <h3>학생 정보 - Flask SQLAlchemy 예제</h3> <hr/> {%- 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="name">이름</label><br> <input type="text" name="name" placeholder="Name" /><br> <label for="email">도시</label><br> <input type="text" name="city" placeholder="city" /><br> <label for="addr">주소</label><br> <textarea name="addr" placeholder="addr"/><br> <label for="PIN">도시</label><br> <input type="text" name="pin" placeholder="pin" /><br> <input type="submit" value="제출" /> </form> </body> </html>
http 메서드가 POST로 감지되면, 폼 데이터가 students 테이블에 삽입되고, 애플리케이션이 데이터를 표시하는 메인 페이지로 돌아갑니다.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 @app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('모든 필드를 입력하십시오', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) db.session.add(student) db.session.commit() flash('기록이 성공적으로 추가되었습니다') return redirect(url_for('show_all')) return render_template('new.html')
아래는 완전한 애플리케이션 코드입니다 ( app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 from flask import Flask, request, flash, url_for, redirect, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3' app.config['SECRET_KEY'] = "random string" db = SQLAlchemy(app) class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10)) def __init__(self, name, city, addr, pin): self.name = name self.city = city self.addr = addr self.pin = pin @app.route('/) def show_all(): return render_template('show_all.html', students = students.query.all()) @app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('모든 필드를 입력하십시오', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) print(student) db.session.add(student) db.session.commit() flash('기록이 성공적으로 추가되었습니다') return redirect(url_for('show_all')) return render_template('new.html') if __name__ == '__main__': db.create_all() app.run(debug=True)
Python 셸에서 스크립트를 실행하고, 브라우저에서 다음을 입력하세요: http://localhost:5000/ 그런 다음, 다음과 같은 결과를 볼 수 있습니다 -
“을 클릭하세요 추가”링크를 열어 학생 정보 양식을 열어주세요.
양식을 작성하고 제출하면, 메인 페이지에 제출한 데이터가 나타납니다. 작업 후, 다음과 같은 출력을 볼 수 있습니다.