flask database handling how use flask with database
このFlaskデータベースチュートリアルでは、Flask MySQL、Flask MongoDB、SQLiteなどのさまざまなデータベースでFlaskを使用する方法を学びます。
最初のFlaskPythonチュートリアルでカバーされている概念を拡張します。まず、ドキュメントベースのNoSQLデータベースであるMongoDBでFlaskを使用します。ここで、NoSQLはNot OnlySQLの略です。
まず、データベースとの接続の概念について説明し、次に1つのデータベースでロックされないようにする方法を説明します。必要に応じて、構成のみを変更してデータベースバックエンドを変更できます。
=> ここで完璧なフラスコトレーニングガイドをチェックしてください
学習内容:
Flaskデータベースチュートリアル
このチュートリアルでは、読者は議論されたデータベース間の比較を描くことができます。さらに、Flask-MongoEngine、Flask-SQLAlchemy、およびFlaskMongoAlchemyについても説明します。これらの2つのORM、つまりオブジェクトリレーションマッパーは非常に人気があります。
内部の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
このセクションでは、生のSQLスクリプトを使用してFlaskのデータベースを操作するのではなく、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で使用できる2つの有名なORMについて説明しました。
データベースデザイナを使用して、AlbumとSongという2つのテーブルを作成し、AlbumとSongの間に1対多の関係を定義しました。以下は同じものを描いた画像です。

フラスコMongoEngine
それでは、最初のMongoEngineDBモデルを作成しましょう。
appディレクトリの下にファイル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という2つのMongoEngineモデルを作成しました。これらのモデルは、MongoDBのそれぞれのドキュメントに対応しています。
アルバムには、いくつかの制約がある文字列型のフィールドが1つあります。
- アルバム名はユニークです。
- アルバム名を空白にすることはできません。
- アルバム名は最大100文字です。
同様に、ドキュメントSongには、タイトル、評価フィールド、および別のドキュメントAlbumを指す参照フィールドがあります。このファイルを保存し、これら2つのモデルを使用してデータを作成しましょう。プロジェクトのルートディレクトリに移動し、flask shellコマンドを使用して、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)データベースのリストを確認する
> 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)アルバムコレクション内の任意の1つのドキュメントを一覧表示します。
> db.album.findOne() #----- output ---- { '_id' : ObjectId('5eddb43b8b1e179bef87d41d'), 'name' : 'Album1' } #----- output ----
#5)曲のコレクションにドキュメントを1つリストします。
> 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') }
上記のスニペットの2番目のクエリの出力で、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操作を実行できます。したがって、下の画像に示すように、SongViewサブメニューを使用して曲を作成しましょう。関連するデータベースモデルの参照フィールドがドロップダウンにどのように表示されるかに注意してください。さらにいくつかのアルバムと曲を作成してみてください。

MongoAlchemyを使用して、同じ概念をさらに詳しく調べることができます。もう1つの使いやすく、Pythonを使用してMongoDBデータベースに簡単にアクセスして操作できるように構築された同様のORM。
MongoAlchemyのドキュメントを確認してください ここに 。ただし、最初に以下のセクションを実行して、Flask-SQLAlchemyの基本的な理解を深めることをお勧めします。
FlaskSqliteまたはFlaskMySQL
このセクションでは、バックエンドエンジンと同じSQLAlchemyアプリケーションを再利用します。したがって、これまでのすべての変更をコミットして、別のGitブランチtutorial-3-sqlaを作成してください。 FlaskはSQLiteとMySQLをバックエンドデータベースとして使用できます。これらのリレーショナルデータベースでは、ORMとしてSQLAlchemyを使用することをお勧めします。
新しいブランチをチェックアウトした後に行う必要のある変更から始めましょう。
構成
プロジェクトのルートディレクトリにあるconfig.pyを開き、MongoDBの接続文字列を削除します。 config.pyをFlaskSQLiteまたはFlaskMySQLの接続文字列で更新します。
# 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 fabcreate-adminコマンドを使用してadminユーザーを作成します。ここで、前述のように開発サーバーを起動します。 Pythonrun.pyを使用します。 http:// localhost:8080に移動します。
この時点で、アプリケーションはMongoDBの場合と同じように機能します。前のセクションで行ったように、すべてのCRUD操作でテストしてください。
さらに、SQLite DBブラウザを使用しながら、データベースモデルに対応する両方のテーブルを示しました。


フラスコMySQL
MySQLをデータベースバックエンドとして使用するには、Flask-SQLAlchemyを使用するときに、config.py内のデータベースに関する1つの構成を更新するだけで済みます。
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
指定された接続文字列に従って、データベースの名前はmyappです。データベースに接続するユーザーはmyapp @ localhostです。ただし、これらは両方とも前提条件であり、以下の詳細を使用して作成する必要があります。
したがって、以下のクエリを使用してユーザーとデータベースを作成し、FlaskMySQLデータベースを相互に連携させます。 MySQLクライアントでこれらのクエリを実行します。
CREATE USER 'myapp'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE myapp;
Python3mysqlclientもインストールする必要があります。以下のコマンドで指定されているように、開発ヘッダーとライブラリをインストールします。
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に移動できます。次に、FlaskSQLiteの場合に取得したアプリケーションにアクセスします。
フラスコ移行
アプリケーションの初期の開発中に、データベースのスキーマに多くの変更があります。開発時間にかなりのオーバーヘッドを追加する開発者は、これらの変更を頻繁に行う必要があります。このような同様のシナリオでは、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
上記のコマンドと同様に、移行を作成し、upgradeコマンドを使用してそれらを適用するコマンドがあります。これらの移行コマンドは、必要に応じて、以降のチュートリアルのワークフローの一部として使用します。
よくある質問
Flaskでのデータベースの使用に関連するいくつかの質問に出くわすかもしれません。
Q#1)Flaskはどのデータベースを使用しますか?
回答: Flaskは、Python用のデータベースツールキットであり、ORM(Object Relation Mapper)であるSQLAlchemyでサポートされているすべてのデータベースをサポートしています。 PyPIからFlask-SQLAlchemyをインストールして、SQLAlchemyを操作できます。
Flask-AlchemyはFlaskプラグインであり、インストール以外の最小限の構成が必要です。開発者がFlask-SQLAlchemyで使用する一般的なデータベースには、SQLite、PostgreSQL、MySQLなどがあります。
Flaskには、Flask-MongoEngine、Flask-MongoAlchemy、Flask-CouchDBなどのプラグインもあり、MongoDBやCouchDBなどのNoSQLドキュメントベースのデータベースと連携します。
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とも呼ばれるさまざまなオブジェクトリレーショナルマッパーを使用します。これらのORMには通常、クエリ属性を使用してデータベースにアクセスし、定義されたデータベースモデルからデータを読み取るためのAPIがあります。 Pythonのデータ構造に保存されているクエリの結果は、Flaskテンプレートを使用して表示されます。
ただし、データベースモデルのテスト中に、結果をFlaskShellのコンソールに印刷することもできます。
Flask-SQLAlchemyのクエリAPIを使用してデータをクエリするそのような例の1つを以下に示します。
>>> user1 = User.query.filter_by(username='testuser').first() >>> user1.id 2 >>> user1.email u'user1@example.org'
結論
このチュートリアルでは、同じプロジェクトレイアウトを使用して異なるデータベースに接続することに関連する概念について説明しました。コード内に生のSQLクエリを記述するというパラダイムから離れました。
モデルの形でテーブルを書くアプローチは、私たちをより機敏にします。また、データベース情報を移行として保存する概念についても説明しました。移行により、開発ワークフローの柔軟性がさらに高まります。
これまで、Flaskアプリビルダーによって自動的に生成されるアーキタイプに取り組んできました。このシリーズの次のチュートリアルでは、もう1つのステップを踏んで、他のFlaskボイラープレートとFlaskブループリントの操作の概念について説明します。
APKファイルを開くにはどうすればよいですか
=> ここですべてのFlaskチュートリアルを確認してください