☆☆ 新着記事 ☆☆

2019年7月7日日曜日

Flask SQLAlchemy で作る簡単CRUDアプリ

Flask SQLAlchemy書籍管理アプリを作ります。Flask自身は、操作できるのが前提です。
作成されたDBを確認するコマンドも解説しますが、
以下のサイトでも確認できます。

== databaseのオンラインチェック用 url ==



1. 最終形

sqlalc.py

import os

from flask import Flask
from flask import redirect
from flask import render_template
from flask import request

from flask_sqlalchemy import SQLAlchemy

project_dir = os.path.dirname(os.path.abspath(__file__))
database_file = "sqlite:///{}".format(os.path.join(project_dir, "bookdatabase.db"))

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database_file

db = SQLAlchemy(app)

class Book(db.Model):
    title = db.Column(db.String(80), unique=True, nullable=False, 
               primary_key=True)

    def __repr__(self):
        return "<Title: {}>".format(self.title)

@app.route('/', methods=["GET", "POST"])
def home():
    books = None
    if request.form:
        try:
            book = Book(title=request.form.get("title"))
            db.session.add(book)
            db.session.commit()
        except Exception as e:
            print("Failed to add book")
            print(e)
    books = Book.query.all()
    return render_template("home.html", books=books)

@app.route("/update", methods=["POST"])
def update():
    try:
        newtitle = request.form.get("newtitle")
        oldtitle = request.form.get("oldtitle")
        book = Book.query.filter_by(title=oldtitle).first()
        book.title = newtitle
        db.session.commit()
    except Exception as e:
        print("Couldn't update book title")
        print(e)
    return redirect("/")

@app.route("/delete", methods=["POST"])
def delete():
    title = request.form.get("title")
    book = Book.query.filter_by(title=title).first()
    db.session.delete(book)
    db.session.commit()
    return redirect("/")


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



templates/home.html


 
<html>
  <body>
    <h1>Add book</h1>
    <form method="POST" action="/">
      <input type="text" name="title">
      <input type="submit" value="Add">
    </form>

    <h1>Books</h1>
    <table>
      {% for book in books %}
        <tr>
          <td>
            {{book.title}} 
          </td>
          <td>
            <form method="POST" action="./update" style="display: inline">
              <input type="hidden" value="{{book.title}}" name="oldtitle">
              <input type="text" value="{{book.title}}" name="newtitle">
              <input type="submit" value="Update">
            </form>
          </td>
          <td>
            <form method="POST" action="./delete" style="display: inline">
              <input type="hidden" value="{{book.title}}" name="title">
              <input type="submit" value="Delete">
            </form>
          </td>
        </tr>
        {% endfor %}
    </table>
  </body>
</html>
 



1. Step1
dependencyのインストール

pip3 install --user flask sqlalchemy flask-sqlalchemy


2. DBのセットアップ

SQLite databaseを使います。

ここでは、シェル・コマンドから最初のDBを作成します。

pythonを起動してから、以下を実行。

>>> from sqlalc import db
>>> db.create_all()

これで、カレントディレクトリにDB(bookdatabase.db)が作成されます。




この段階で、上記のページが表示できるようになります。

2nd Screen



(登録されているレコードは、以下のようにコマンドラインから確認することが出来る。)
> flask shell
>from sqlalc import db
> from sqlalc import Book
>list = Book.query.all()
>print(list)
[<Title: beatiful soup>, <Title: art of the deal>]

又は、python からsqlite3を起動してDBに接続して確認することもできる。
>python
>>> import sqlite3
>>> connection = sqlite3.connect('bookdatabase.db')
>>> cursor = connection.cursor()
>>> cursor.execute('SELECT * FROM Book')
<sqlite3.Cursor object at 0x0000000001E67880>
>>> rows = cursor.fetchall()
>>> for row in rows:
...     print(row)
...
('beatiful soup',)
('art of the deal',)


(その他の例)
参考)
Python Flask Tutorial: Full-Featured Web App Part 4 - Database with Flask-SQLAlchemy
https://www.youtube.com/watch?v=cYWiDiIUxQc&t=1515s

×Connecting to a SQLite Database Using Flask-SQLAlchemy (Pretty Printed)
https://www.youtube.com/watch?v=KrRzZGcHjK8
(コネクトしてお終い。役に立つ情報なし。)


(参考スクリプト)

◇簡単ユーザ管理
https://stackoverflow.com/questions/43409670/delete-one-row-from-database-with-sqlalchemy-flask

class Subscriber(db.Model):
    user_id = db.Column(db.Integer, primary_key=true)
    client_id = ....
    ....

    # method to add new subscriber
    def __init__(self, user_id, client_id)
        self.user_id = user_id
        self.client_id = client_id


@app.route('/subscribe/')
def subscribe():
    # add a subscriber with user id 21, client 543
    new = Subscriber(21, 543)
    db.session.add(new)
    db.session.commit()


@app.route('/unsubscribe/')
def unsubscribe():
    # remove subscriber
    Subscriber.query.filter_by(user_id=21, client_id=543).delete()
    db.session.commit()

0 件のコメント:

コメントを投稿