はじめに
ブログアプリケーションでは記事の投稿、閲覧を行うのに、実際の記事データを保存し、必要に応じてデータを取り出せるようにする必要がある。
実際のデータを保存しておくべき場所がデータベースで、データベースから効率よくデータ保存したり取り出すためのシステムを、データベース管理システムと呼ぶ。
今回は、ブログアプリケーションで必要なデータベースを設定し、使えるようにする。
SQLAlchemyのインストール
Flaskでは簡単にデータベース設定し、扱うことのできるSQLAlchemyというライブラリが存在する。今回はこのライブラリを使用する。
以下のコマンドを実行し、SQLAlchemyをインストールする。
pipenv install Flask-SQLAlchemy
SQLAlchemyの初期設定
config.pyにて以下のように設定する。今回はSQLiteを使用する。
SQLALCHEMY_DATABASE_URI = ‘sqlite://flask_blog.db’
SQLALCHEMY_TRACK_MODIFICATIONS = True
DEBUG = True
SECRET_KEY = ‘secret key’
USERNAME = ‘yuji’
PASSWORD = ‘yuji123’
__init__.pyを修正する。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('flask_blog.config')
db = SQLAlchemy(app)
import flask_blog.views
from flask_sqlalchemy import SQLAlchemy にてSQLAlchemyライブラリをインストールする。
その後、db =SQLAlchemy(app)の1行を追加する。
これにより、他のブログラムはdbという変数を参照することでデータベースを扱うことができるようになった。
モデルを作る MTVフレームワークにおける Model
次にデータベースを定義する。
ブログの記事は、タイトルと本文が含まれている必要がある。そして投稿日時も追加する。
このとき、記事には、タイトル、本文、投稿日時、という属性が必要がある。このような、記事はどのような属性を持っている、という定義するのがモデルになる。
直接、データベースの中身を触ろうととすると複雑な操作が必要になっていく。
一方、モデルを定義すると、プログラムでは定義したモデルに対して簡単な指示をするだけで自動でデータベースウィ適切に操作してくれるので、簡単にデータベースを扱うことができるようになる。
これを、ORM(Object Relation Mapping)と読んでいる。モデル(object)とデータベース(Relation)を結びつける(Mapping)ことで、データ操作を行いや
すくするベストプラクティスなる。
モデルの定義
記事というモデルを定義する。
flask_blog以下にmodelsというフォルダを作成し、その中にentries.pyというファイルを作成する。
from flask_blog import db
from datetime import datetime
class Entry(db.Model):
__tablrname__=‘entries’
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.string(50)), unique=True)
text = db.Column(db.text)
created_at =db.Column(db.DateTime)
def__init__(self, title=None, text=None):
self.title = title
self.text = textself.created_at = datetime.utcnow()
def__repr__(self):
return‘<Entry id:{} title:{} text:{}>’format(self.id, self.title, self.text)
関連モジュールのインポート
1行目と2行目になる。from flask_blog import dbにて、前章で作成したデータベースモジュールをインポートする。続いて、投稿日時などで日付を扱うのでfrom datetime import datetimeと日付を扱うdatetime
モジュールをインポートする。
class によるモデルの定義
次の行から、実際のモデルを定義する。
モデルは、pythinにおけるclassとして定義する。
Class Entry(db.model)と書き、モデルにEntryという名前を付けている。
__tablename__ = ‘entryies’は実際のデータベースに格納されるテーブルの名前である。
モデルごとに別の名前をつける必要があり、ここではentriesというな目でテーブルがデータベースに格納されている。実際には直接データベースを操作せず、Entryモデルを経由して操作するので、この設定内容を機にすることはない。
属性の定義
次に、実際の属性名を定義している。
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.string(50)), unique=True)
text = db.Column(db.text)
created_at =db.Column(db.DateTime)1行目を見ている。
1行目を見ている。
id = db.Column(db.Integer,primary_key=True)
これは、数字からなるidという属性を、primary_keyとして定義するという意味である。
db.Intergerは、数字が入ると定義している。
primaery_keyという各記事を特定するための番号で、一意である必要がある。
primary_keyはモデル内に一つだけ存在する必要がある。
後にデータを取り出す時は、primaery_keyであるidを使って参照することになる。
このID属性の定義は必要なので、モデル定義の際にはこの1行を必ずかくと覚えておけば良い。
2行目以降も、このルールに従って属性を定義していく。db.String(50)というのは50文字以内の文字からなる、という意味。
Unique=Trueは、タイトルは他の記事と重複せず常に位置であるという制約を追加している。
これにより、すでに、存在するタイトル遠野じ内容の記事が作成されないように制限することができる。
db.Textは、大量のテキストを内容を保存するときに使う。db.DateTimeは日付の保存するのに使う。
モデルが作成されたときの処理を定義する
def__init__()は、モデルが作成されたときの標準の動作を定義するところである。
def__init__(self, title=None, text=None):
self.title = title
self.text = text
self.created_at = datetime.utcnow()
この定義により、今後以下のように書くことで、指定したタイトルと内容かつ現在時間を投稿日時として記事データが作成されるようになる。
参照されたときの表示フォーマットを定義する
def__repr__(self)はなくても内容だが、実際に記事モデルが参照されたときのコンソールでの出力形式を記載している。
def__repr__(self):
return‘<Entry id:{} title:{} text:{}>’format(self.id, self.title, self.text)
ここでは、idとタイトル、テキストがコンソールで表示されるようになっている。
終わりに
ここまでで、実際にデータベースモジュールと、モデルの定義まで完了した。次回は、モデルで定義した内容をデータベースに反映させる。
コメント