FlaskとSQLAlchemyを用いたデータベーステーブルの作成と基本操作

データベースに記事を保存するためのテーブルを作成しましょう。テーブル名は「entry」とし、id、title、contentという3つのカラムを持ちます。

まず、設定ファイルであるconfig.pyを作成します。

DEBUG = True
#dialect+driver://username:password@host:port/database
DB_TYPE = 'mysql'
DB_DRIVER='pymysql'
DB_USER = 'root'
DB_PASS = '1q2w3e4r5t'
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_NAME = 'db_demo1'

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DB_TYPE,DB_DRIVER,DB_USER,DB_PASS,DB_HOST,DB_PORT,DB_NAME)
SQLALCHEMY_TRACK_MODIFICATIONS = False
print(SQLALCHEMY_DATABASE_URI)

Flaskアプリケーション内でEntryというクラスを新規作成し、id、title、contentを定義します。db.create_all()を実行すると、データベースに自動的にテーブルが作成されます(テーブル名はentry)。

from flask import Flask
import config

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)
app.config.from_object(config)

db = SQLAlchemy(app)
Base = declarative_base()


class Entry(db.Model):
    __tablename__ = 'entry'
    id  = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=True)


db.create_all()


@app.route('/')
def index():
    return 'index'


if __name__ == '__main__':
    app.run(debug=True)

Flaskアプリケーションを起動後、データベースでテーブルとその構造を確認すると、新しいテーブルが正常に作成されていることがわかります。

データベーステーブルに対するCRUD操作(作成、読み取り、更新、削除)の実装例:

    #作成(Create)
    new_entry = Entry(title="初めての投稿", content="これは私の最初の投稿です")
    db.session.add(new_entry)
    db.session.commit()

    #読み取り(Read)
    result = Entry.query.filter(Entry.title=="初めての投稿").first()
    print(result.title)
    
    #更新(Update)
    entry_to_update = Entry.query.filter(Entry.title=="初めての投稿").first()
    entry_to_update.title = "更新された最初の投稿"
    db.session.commit()
    
    #削除(Delete)
    entry_to_delete = Entry.query.filter(Entry.title=="更新された最初の投稿").first()
    db.session.delete(entry_to_delete)
    db.session.commit()

完全なアプリケーションコード例:

from flask import Flask
import config

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)
app.config.from_object(config)

db = SQLAlchemy(app)
Base = declarative_base()


class Entry(db.Model):
    __tablename__ = 'entry'
    id  = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=True)


db.create_all()


@app.route('/')
def index():
    #作成(Create)
    new_entry = Entry(title="最初のエントリ", content="これは私の最初のエントリです")
    db.session.add(new_entry)
    db.session.commit()

    #読み取り(Read)
    result = Entry.query.filter(Entry.title=="最初のエントリ").first()
    print(result.title)
    
    #更新(Update)
    entry_to_update = Entry.query.filter(Entry.title=="最初のエントリ").first()
    entry_to_update.title = "更新された最初のエントリ"
    db.session.commit()
    
    #削除(Delete)
    entry_to_delete = Entry.query.filter(Entry.title=="更新された最初のエントリ").first()
    db.session.delete(entry_to_delete)
    db.session.commit()

    return 'index'


if __name__ == '__main__':
    app.run(debug=True)

タグ: flask SQLAlchemy ORM MySQL Python

6月22日 21:48 投稿