Flask-FileAlchemy
は、Markdown または YAML 形式のプレーンテキスト ファイルをアプリのメイン データ ストアとして使用できるようにする Flask 拡張機能です。
$ pip install flask-filealchemy
ローカルでのみ実行する必要があるアプリケーションにどのデータ ストアを使用するかに関する制約は、運用トラフィックを処理する必要があるアプリケーションに比べてかなり緩和されます。このようなアプリケーションでは、使いやすさのためにパフォーマンスを犠牲にしても通常は問題ありません。
ここでの非常に強力な使用例の 1 つは、静的サイトの生成です。 Frozen-Flask を使用して Flask アプリケーション全体を HTML ファイルのセットに「フリーズ」できますが、アプリケーションは依然としてどこかからデータを読み取る必要があります。これは、データ ストアをセットアップする必要があることを意味します。データ ストアは (ローカルで) ファイル ベースの SQLite になる傾向があります。これは非常にうまく機能しますが、データを入力するために SQL ステートメントを実行することも意味します。
所有するデータ モデルの数とそれに含まれる型によっては、これはすぐに手に負えなくなる可能性があります (ブログ投稿用にINSERT
ステートメントを記述しなければならないことを想像してください)。
さらに、データのバージョン管理はできません。技術的には可能ですが、差分は人間には意味がありません。
Flask-FileAlchemy を使用すると、代替データ ストア (プレーン テキスト ファイル) を使用できます。
プレーン テキスト ファイルには、人間にとって非常に扱いやすいという利点があります。さらに、バージョン管理できるため、アプリケーション データとコードの両方が一緒にチェックインされ、履歴が共有されます。
Flask-FileAlchemy を使用すると、Markdown または YAML 形式のプレーン テキスト ファイルにデータを入力し、Flask-SQLAlchemy を使用して定義した SQLAlchemy モデルに従ってそれらのデータをロードできます。このデータは、使用しているデータ ストア (インメモリ SQLite) に格納されます。最適に動作します)。これで、アプリが必要に応じてクエリを実行できるようになります。
これにより、静的サイトのシンプルさを損なうことなく、動的サイトの快適さを維持できます。
標準の (Flask)SQLAlchemy API を使用してデータ モデルを定義します。例として、 BlogPost
モデルは次のように定義できます。
app = Flask ( __name__ )
# configure Flask-SQLAlchemy
app . config [ 'SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///:memory:'
db = SQLAlchemy ()
db . init_app ( app )
class BlogPost ( db . Model ):
__tablename__ = 'blog_posts'
slug = Column ( String ( 255 ), primary_key = True )
title = Column ( String ( 255 ), nullable = False )
content = Column ( Text , nullable = False )
次に、ディスク上のどこかにdata/
ディレクトリを作成します (物事を簡単にするために、このディレクトリをアプリケーション ルートに置くことをお勧めします)。定義したモデルごとに、このdata/
ディレクトリの下に__tablename__
属性と同じ名前のディレクトリを作成します。
現在、データを定義する 3 つの異なる方法をサポートしています。
1 つ目の方法は、 data/<__tablename__>/
ディレクトリ内に複数の YAML ファイルを置き、各ファイルが 1 つのレコードに対応するようにする方法です。
「ブログ」の例の場合、次の内容のファイルdata/blog_posts/first-post-ever.yml
を作成することで、新しいBlogPost
レコードを定義できます。
slug : first-post-ever
title : First post ever!
content : |
This blog post talks about how it's the first post ever!
同じディレクトリにそのようなファイルをさらに追加すると、より多くのレコードが生成されます。
2 ~ 3 個を超えるフィールドを持たない「小規模な」モデルの場合、Flask-FileAlchemy は_all.yml
ファイルからの読み取りをサポートします。このような場合、行ごとに 1 つのファイルを追加するのではなく、テーブル ディレクトリ内の_all.yml
ファイルにすべての行を追加するだけです。
「ブログ」の例では、次のようになります。
- slug : first-post-ever
title : First post ever!
content : This blog post talks about how it's the first post ever!
- slug : second-post-ever
title : second post ever!
content : This blog post talks about how it's the second post ever!
Frontmatter メタデータを含む Jekyll スタイルの Markdown ファイルからデータをロードすることもできます。
ブログの例の場合、次の内容を含むdata/blog_posts/first-post-ever.md
ファイルを定義することで、新しいBlogPost
レコードを作成できます。
---
slug : first-post-ever
title : First post ever!
---
This blog post talks about how it's the first post ever!
マークダウンを使用してデータを定義する場合、メインのマークダウン本文に関連付けられた列の名前はcontent
である必要があることに注意してください。
最後に、 Flask-FileAlchemy
セットアップで構成し、すべてのデータをロードするように依頼します。
# configure Flask-FileAlchemy
app . config [ 'FILEALCHEMY_DATA_DIR' ] = os . path . join (
os . path . dirname ( os . path . realpath ( __file__ )), 'data'
)
app . config [ 'FILEALCHEMY_MODELS' ] = ( BlogPost ,)
# load tables
FileAlchemy ( app , db ). load_tables ()
次に、 Flask-FileAlchemy
指定されたディレクトリからデータを読み取り、 Flask-FileAlchemy
構成した選択したデータ ストアにデータを保存します (優先順位はsqlite:///:memory:
)。
db.session
を使用してこのデータベースに書き込むことはできないことに注意してください。技術的には許可されていますが、アプリが行った変更はメモリ内のデータ ストアに反映されるだけで、ディスクには永続化されません。
貢献は大歓迎です!
Python 3.7 以降と Poetry がインストールされていることを確認してください。
リポジトリを Git clone します - git clone https://github.com/siddhantgoel/flask-filealchemy
。
開発に必要なパッケージをインストールします ( poetry install
。
基本的にはそれだけです。これで、テスト スイート - poetry run pytest
実行できるようになります。