flask database handling how use flask with database
이 Flask 데이터베이스 자습서에서는 Flask MySQL, Flask MongoDB, SQLite 등과 같은 다양한 데이터베이스에서 Flask를 사용하는 방법을 알아 봅니다.
첫 번째 Flask Python 튜토리얼에서 다루는 개념을 확장합니다. 먼저 문서 기반 NoSQL 데이터베이스 인 MongoDB와 함께 Flask를 사용합니다. 여기서 NoSQL은 Not Only SQL을 나타냅니다.
먼저 데이터베이스와의 연결 개념을 다룬 다음 하나의 데이터베이스로 잠기지 않는 방법을 알려드립니다. 필요한 경우 구성 만 수정하여 데이터베이스 백엔드를 변경할 수 있습니다.
=> 여기에서 완벽한 플라스크 교육 가이드를 확인하세요.
학습 내용 :
Flask 데이터베이스 튜토리얼
이 튜토리얼에서 독자는 논의 된 데이터베이스 간의 비교를 그릴 수 있습니다. 또한 Flask-MongoEngine, Flask-SQLAlchemy 및 Flask MongoAlchemy에 대해 이야기합니다. 이 두 ORM, 즉 Object Relation Mapper는 꽤 유명합니다.
내부의 ORM은 객체 (데이터베이스 모델)를 데이터베이스 명령 또는 SQL 문으로 투명하게 변환합니다.
ORM 사용의 이점은 다음과 같습니다.
- 개발자는 테이블과 SQL 대신 개체로 작업 할 수 있습니다.
- 마이그레이션을 사용하여 데이터베이스 업데이트를 추적하십시오.
- 개발 비용과 시간을 줄여줍니다.
- 데이터베이스 별 SQL 차이를 극복합니다.
ORM을 사용할 때 프로그래머는 기본 SQL 명령을 수행하기 위해 복잡한 SQL 쿼리 및 명령을 작성할 필요가 없습니다.
데이터베이스에 연결
구성 파일을 열고 아래에 언급 된 값을 확인하십시오. Flask-Appbuilder는 언급 된 값에서 연결 문자열에 대한 데이터베이스 세부 정보를 가져옵니다.
# The MongoEngine connection string. MONGODB_SETTINGS = { 'DB': 'mydb', 'connect': False, }
ORM에 의한 데이터베이스 관리의 모든 저수준 기능은 Flask Click 명령으로 래핑되었으며, 명령 줄에서 flask fab –help를 사용하여 확인할 수 있습니다.
플라스크 MongoDB
이 섹션에서는 Flask에서 데이터베이스 작업을 위해 원시 SQL 스크립트를 사용하는 대신 ORM을 사용하는 방법을 배웁니다.
MongoDB 비 관계형 문서 기반 데이터베이스입니다. 현재 플라스크 튜토리얼 예제 애플리케이션으로 이미 구성했습니다.
아래에 제공된 명령을 사용하여 로컬 머신에서 MongoDB 서버를 관리하십시오.
sudo systemctl start mongod # to start MongoDB sudo systemctl stop mongod # to stop MongoDB sudo systemctl status mongod # to check status MongoDB
MongoDB 및 Flask와 함께 사용할 수있는 두 가지 유명한 ORM에 대해 논의했습니다.
데이터베이스 디자이너를 사용하여 Album과 Song이라는 두 개의 테이블을 만들고 Album과 Song 간의 일대 다 관계를 정의했습니다. 다음은 같은 것을 묘사하는 이미지입니다.

Flask MongoEngine
이제 첫 번째 MongoEngine DB 모델을 만들어 보겠습니다.
앱 디렉토리에서 models.py 파일을 생성하거나 편집하고 다음 코드를 추가합니다.
from mongoengine import Document from mongoengine import DateTimeField, StringField, ReferenceField, ListField, IntField class Album(Document): name = StringField(unique=True, required=True, max_lenth=100) def __str__(self): return self.name class Song(Document): title = StringField(max_lenth=200, required=True, unique=True) rating = IntField(default=0,max_lenth=1) # 1 to 9 album = ReferenceField(Album) def __str__(self): return self.title
우리는 Album과 Song이라는 두 개의 MongoEngine 모델을 만들었습니다. 이 모델은 MongoDB의 각 문서에 해당합니다.
앨범에는 몇 가지 제약 조건이있는 문자열 유형 필드가 하나 있습니다.
- 앨범 이름은 고유합니다.
- 앨범 이름은 비워 둘 수 없습니다.
- 앨범 이름은 최대 100 자까지 가능합니다.
마찬가지로 노래 문서에는 제목, 등급 필드 및 다른 문서 인 앨범을 가리키는 참조 필드가 있습니다. 이 파일을 저장하고이 두 모델을 사용하여 데이터를 생성하겠습니다. 프로젝트의 루트 디렉터리로 이동하고 flask 셸 명령어를 사용하여 Python 셸에서 flask 애플리케이션에 액세스합니다.
셸에 들어가면 아래 문을 사용하여 MongoEngine 모델에 액세스하고 아래와 같이 샘플 데이터를 생성합니다.
>>> from app.models import Album, Song >>> album1 = Album(name='Album1') >>> album1.save() >>> song1 = Song(title='Song1', rating=9, album=album1) >>> song1.save()
이제 Mongo 클라이언트를 사용하여 데이터베이스에 액세스하고 위에 제공된 설명의 결과로 데이터가 저장되는지 확인하겠습니다. 위의 코드에서 먼저 Album과 Song을 가져온 다음 필요한 매개 변수 값으로 개체를 만듭니다.
여기 매개 변수는 모델에 정의 된 필드 이름이며 해당 매개 변수에 대한 값으로 데이터를 언급합니다. 개체 생성이 성공하면 각 개체에 대해 save 메서드를 호출하여 데이터베이스에 문서를 저장합니다.
mongo 명령을 사용하여 MongoDB에 액세스합니다. mongo 클라이언트를 사용하여 서버에 연결 한 후 아래 명령을 사용하십시오.
# 1) 데이터베이스 목록 확인
Eclipse에서 프로젝트를 시작하는 방법
> show dbs #----- output ---- admin 0.000GB config 0.000GB local 0.000GB mydb 0.001GB #----- output ----
# 2) mydb라는 데이터베이스 사용
> use mydb #----- output ---- switched to db mydb #----- output ----
# 3) RDBMS에서 테이블 일명 컬렉션 확인
> show collections #----- output ---- album permission permission_view role song user view_menu #----- output ----
# 4) 앨범 컬렉션에있는 문서 하나를 나열합니다.
> db.album.findOne() #----- output ---- { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } #----- output ----
# 5) 노래 모음에있는 문서 하나를 나열하십시오.
> db.song.findOne() #----- output ---- { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddb43b8b1e179bef87d41d') } #----- output ----
Django와 함께 작업했다면 MongoEngine이 Django의 내장 ORM과 매우 유사하게 작동한다는 것을 알게 될 것입니다. 마지막 출력에서 노래를 쿼리 할 때 앨범 필드에 대한 다른 문서의 참조가 어떤지 확인하십시오.
이제 다른 앨범을 만들고 기존 노래 문서를 업데이트 해 보겠습니다.
>>> from app.models import Album, Song >>> album2 = Album(name='Album2') >>> album2.save() >>> songs_q = Song.objects(title='Song1') # query the database >>> songs_q.count() 1 >>> song1 = songs_q(0) >>> song1.album = album2 # update the album field >>> song1.save()
우리는 두 모델, 즉 앨범과 노래를 모두 가져옵니다. 그런 다음 album2라는 새 문서를 만듭니다. 데이터베이스에서 노래 모음을 쿼리하고 제목을 사용하여 노래를 가져옵니다. 그런 다음 쿼리 결과의 배열 인덱스를 사용하여 객체에 액세스하고 할당 연산자를 사용하여 업데이트하고 업데이트 된 문서를 저장합니다.
이제 Mongo 클라이언트를 다시 사용하여 저장된 컬렉션을 확인하겠습니다.
> db.album.find().pretty() ## output { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } { '_id' : ObjectId('5eddbaab9fd7d3ec78b2fd8f'), 'name' : 'Album2' } > db.song.find().pretty() ## output { '_id' : ObjectId('5eddb74b0177c8f096d880ec'), 'title' : 'Song1', 'rating' : 9, 'album' : ObjectId('5eddbaab9fd7d3ec78b2fd8f') }
위 스 니펫의 두 번째 쿼리 출력에서 Song1 문서의 업데이트 된 앨범 필드를 확인합니다.
이제 앨범 및 노래 컬렉션에서 문서를 삭제하겠습니다. 아래 코드를 사용하여 레코드를 제거하십시오. 아직 플라스크 셸에있는 경우 아래에 언급 된 명령을 사용하여 문서를 삭제하고 삭제를 확인합니다.
>>> song1.delete() >>> songs_q = Song.objects(title='Song1') >>> songs_q.count() 0 >>>
song1에서 delete 메서드를 사용하여 노래 컬렉션에서 문서를 삭제합니다. 플라스크 셸을 사용하여 모든 기본 CRUD 작업을 수행 할 수 있습니다. 또한 flask_appbuilder의 ModelView 클래스를 사용하여 데이터베이스 모델을 뷰로 표시 할 수 있습니다.
아래 코드와 같이 모델 기반보기를 만듭니다.
from app.models import Album, Song from flask_appbuilder import ModelView from flask_appbuilder.models.mongoengine.interface import MongoEngineInterface class SongsView(ModelView): datamodel = MongoEngineInterface(Song) class AlbumView(ModelView): datamodel = MongoEngineInterface(Album)
먼저 ModelView 및 MongoEngineInterface와 함께 데이터베이스 모델을 가져옵니다. 그런 다음 ModelView를 하위 클래스로 만들고 특정 MongoEngineInterface 인스턴스를 뷰의 데이터 모델 속성에 할당합니다.
이제 아래와 같은 메뉴로 SongsView와 AlbumView를 같은 카테고리에 등록 해 보겠습니다.
appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
애플리케이션에서 이러한보기에 액세스하려면 http : // localhost : 8080 /로 이동하고 관리자 자격 증명을 사용하여 앱에 로그인 한 다음 아래에 언급 된 단계를 수행하여 기본 데이터베이스 모델 기반보기를 이해합니다.
1 단계: 모델보기 메뉴를 클릭합니다.

2 단계: 앨범보기 하위 메뉴를 클릭합니다.

3 단계 : 더하기 아이콘을 클릭하여 문서 또는 레코드를 만듭니다.

4 단계 : 앨범 이름을 입력하고 저장합니다.
위의 단계와 유사하게 이러한보기를 사용하여 모든 CRUD 작업을 수행 할 수 있습니다. 따라서 아래 이미지와 같이 Song View 하위 메뉴를 사용하여 노래를 만들어 보겠습니다. 관련 데이터베이스 모델의 참조 필드가 드롭 다운에 어떻게 표시되는지 확인하십시오. 더 많은 앨범과 노래를 만들어보십시오.

MongoAlchemy를 사용하여 동일한 개념을 추가로 탐색 할 수 있습니다. 사용하기 쉽고 유사한 ORM이 Python을 사용하여 MongoDB 데이터베이스에 쉽게 액세스하고 조작 할 수 있도록 구축되었습니다.
MongoAlchemy의 문서를 확인하십시오 여기 . 그러나 먼저 아래 섹션을 진행하여 Flask-SQLAlchemy에 대한 기본적인 이해를 구축하는 것이 좋습니다.
Flask Sqlite 또는 Flask MySQL
이 섹션에서는 백엔드 엔진과 동일한 SQLAlchemy 용 애플리케이션의 용도를 변경합니다. 따라서 지금까지 모든 변경 사항을 커밋하고 별도의 Git 분기 tutorial-3-sqla를 생성하십시오. Flask는 SQLite 및 MySQL을 백엔드 데이터베이스로 사용할 수 있습니다. 이러한 관계형 데이터베이스에서는 SQLAlchemy를 ORM으로 사용하는 것이 좋습니다.
새 브랜치를 확인한 후 변경해야 할 사항부터 시작하겠습니다.
구성
프로젝트의 루트 디렉터리에서 config.py를 열고 MongoDB의 연결 문자열을 제거합니다. Flask SQLite 또는 Flask MySQL에 대한 연결 문자열로 config.py를 업데이트합니다.
# The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
앱 __init__.py
이제 app / __ init__.py 파일과 원격 MongoEngine 관련 가져 오기를 열고 아래와 같이 SQLA를 가져옵니다.
#from flask_appbuilder.security.mongoengine.manager import SecurityManager from flask_appbuilder import AppBuilder, SQLA #from flask_mongoengine import MongoEngine # other lines of code #db = MongoEngine(app) db = SQLA(app) #appbuilder = AppBuilder(app, security_manager_class=SecurityManager) appbuilder = AppBuilder(app, db.session)
플라스크 모델
다음 코드로 models.py를 업데이트하고 MongoEngine과 관련된 코드를 제거하십시오.
from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship
플라스크보기
다음 코드로 views.py를 업데이트하십시오.
from flask_appbuilder import ModelView from app.models import Album, Song class AlbumView(ModelView): datamodel = SQLAInterface(Album) class SongsView(ModelView): datamodel = SQLAInterface(Song) appbuilder.add_view(AlbumView, 'Album View', category='Model Views') appbuilder.add_view(SongsView, 'Song View', category='Model Views')
동일한 ModelView 클래스를 사용했지만 MongoEngineInterface를 SQLAInterface로 변경했습니다.
테이블과 해당 관계를 생성하기 위해 아래에 언급 된 명령을 실행하여 데이터베이스 개체를 생성합니다.
flask fab create-db
데이터베이스 백엔드를 변경했음을 기억하십시오. 따라서 flask fab create-admin 명령을 사용하여 관리자를 만듭니다. 이제 이전과 같이 개발 서버를 시작하십시오. 파이썬 run.py를 사용합니다. http : // localhost : 8080으로 이동합니다.
이 시점에서 우리의 애플리케이션은 MongoDB의 경우와 같이 작동합니다. 이전 섹션에서했던 것처럼 모든 CRUD 작업으로 테스트 해보세요.
또한 SQLite DB Browser를 사용하는 동안 데이터베이스 모델에 해당하는 테이블을 모두 표시했습니다.


Flask MySQL
MySQL을 데이터베이스 백엔드로 사용하려면 Flask-SQLAlchemy를 사용할 때 config.py에서 데이터베이스와 관련된 구성 하나만 업데이트하면됩니다.
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
주어진 연결 문자열에 따라 데이터베이스의 이름은 myapp입니다. 데이터베이스에 연결할 사용자는 myapp @ localhost입니다. 그러나 두 가지 모두 전제 조건이며 아래에 제공된 세부 정보를 사용하여 만들어야합니다.
따라서 아래에 제공된 쿼리를 사용하여 사용자와 데이터베이스를 생성하여 Flask MySQL 데이터베이스가 서로 연동되도록합니다. MySQL 클라이언트에서 이러한 쿼리를 실행합니다.
CREATE USER 'myapp'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE myapp;
또한 Python3 mysqlclient를 설치해야합니다. 아래 명령과 같이 개발 헤더 및 라이브러리를 설치하십시오.
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip install mysqlclient
이제 데이터베이스 백엔드를 변경 했으므로 데이터베이스 모델에 해당하는 테이블을 만들어야합니다. 등록 된 모든 메뉴 항목이 보호되고 애플리케이션의 기존 사용자 만 액세스 할 수 있으므로 Flask 관리자를 만들어야합니다.
아래에 제공된 이러한 명령은 테이블 삭제 및 생성을위한 하위 수준 SQL 문을 숨 깁니다.
flask fab create-db flask fab create-admin
위의 모든 단계를 성공적으로 완료하면 http : // localhost : 8080으로 다시 이동할 수 있습니다. 이제 Flask SQLite의 경우 얻은 애플리케이션에 액세스합니다.
플라스크 마이그레이션
응용 프로그램의 초기 개발 중에 데이터베이스 스키마에 많은 변경 사항이 있습니다. 개발 시간에 상당한 오버 헤드를 추가하는 개발자는 이러한 변경을 자주 수행해야합니다. 이러한 유사한 시나리오에서 Flask-Migrate 플러그인은 매우 유용합니다.
Flask-Migrate를 설치하겠습니다.
pip install flask-migrate
성공적으로 설치되면 db 하위 명령이 추가됩니다. 아래에 언급 된 코드를 사용하여이 db 하위 명령에 추가 된 명령 줄 유틸리티를 확인합니다.
flask db --help
먼저 app / __ init__.py에 표시된대로 마이그레이션 개체를 만들어야합니다.
from flask import Flask from flask_migrate import Migrate app = Flask(__name__) migrate = Migrate(app, db)
응용 프로그램에있는 데이터베이스로 몇 가지 명령을 시도해 보겠습니다.
별도의 마이그레이션 저장소를 초기화하십시오.
flask db init
위의 명령과 유사하게 마이그레이션을 만들고 업그레이드 명령을 사용하여 적용하는 명령이 있습니다. 이 마이그레이션 명령은 필요할 때마다 후속 자습서에서 워크 플로의 일부로 사용합니다.
자주 묻는 질문
Flask에서 데이터베이스 사용과 관련된 몇 가지 질문을 접할 수 있습니다.
품질 보증 분석가 인터뷰 질문 및 답변
Q # 1) Flask는 어떤 데이터베이스를 사용합니까?
대답: Flask는 Python 용 데이터베이스 툴킷이며 ORM (Object Relation Mapper) 인 SQLAlchemy에서 지원하는 모든 데이터베이스를 지원합니다. SQLAlchemy와 함께 작동하도록 PyPI에서 Flask-SQLAlchemy를 설치할 수 있습니다.
Flask-Alchemy는 Flask 플러그인이며 설치 외에 최소한의 구성이 필요합니다. 개발자가 Flask-SQLAlchemy와 함께 사용하는 일반적인 데이터베이스 중 일부는 SQLite, PostgreSQL, MySQL 등입니다.
Flask에는 MongoDB 및 CouchDB와 같은 NoSQL 문서 기반 데이터베이스와 함께 작동하는 Flask-MongoEngine, Flask-MongoAlchemy, Flask-CouchDB 등과 같은 플러그인도 있습니다.
Q # 2) Flask에서 데이터베이스를 생성하려면 어떻게해야합니까?
대답: Flask에서 데이터베이스 생성은 일반적으로 해당 Flask 플러그인이 뒤 따르는 패턴에 따라 다릅니다. 거의 모든 플러그인은 프로젝트의 Flask 구성에 정의 된 데이터베이스 연결 설정을 기반으로 데이터베이스를 만듭니다.
그러나 플러그인을 사용하지 않을 때 Flask에서 데이터베이스를 만드는 방법을 직접 작성할 수 있습니다.
아래에 SQLite 예제를 만드는 간단한 예제가 있습니다. 이 예에서는 g Object를 사용하여 데이터베이스 연결의 참조를 유지합니다.
import sqlite3 from flask import g # g and current_app object current_app.config('DATABASE') = 'MYDB' # Name of the database def get_db(): '''A method to get the database connection''' if 'db' not in g: g.db = sqlite3.connect( current_app.config('DATABASE'), detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db def close_db(e=None): '''A method to close the database connection''' db = g.pop('db', None) if db is not None: db.close()
Q # 3) Flask에서 데이터베이스의 데이터를 어떻게 표시합니까?
대답: Flask에서 개발자는 ORM이라고도하는 다양한 Object Relational Mapper를 사용합니다. 이러한 ORM에는 일반적으로 정의 된 데이터베이스 모델에서 데이터를 읽는 쿼리 속성을 사용하여 데이터베이스에 액세스하는 API가 있습니다. Python의 데이터 구조에 저장된 쿼리 결과는 Flask 템플릿을 사용하여 표시됩니다.
그러나 데이터베이스 모델을 테스트하는 동안 Flask Shell의 콘솔에서도 결과를 인쇄 할 수 있습니다.
Flask-SQLAlchemy에서 쿼리 API를 사용하여 데이터를 쿼리하는 한 가지 예가 아래에 나와 있습니다.
>>> user1 = User.query.filter_by(username='testuser').first() >>> user1.id 2 >>> user1.email u'user1@example.org'
결론
이 튜토리얼에서는 동일한 프로젝트 레이아웃을 사용하여 다른 데이터베이스에 연결하는 것과 관련된 개념을 다루었습니다. 우리는 코드 내부에 원시 SQL 쿼리를 작성하는 패러다임에서 벗어났습니다.
모델 형태로 테이블을 작성하는 접근 방식은 우리를 더 민첩하게 만듭니다. 또한 마이그레이션으로 데이터베이스 정보를 저장하는 개념에 대해서도 설명했습니다. 마이그레이션은 개발 워크 플로우에 더 많은 유연성을 추가합니다.
지금까지 Flask 앱 빌더에 의해 자동으로 생성되는 아키 타입에 대해 작업했습니다. 이 시리즈의 다음 튜토리얼에서는 한 단계 더 나아가 다른 Flask 보일러 플레이트와 Flask 블루 프린트 작업 개념에 대해 논의합니다.