English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Flask SQLite

PythonはSQLiteに組み込みのサポートを持ちます。SQLite3Pythonディストリビューションに同梱されているモジュールです。このセクションでは、FlaskアプリケーションがSQLiteとどのように交互作用するかを見てみましょう。

SQLiteデータベースを作成します。 ‘database.db’その中でstudentテーブルを作成します。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
import sqlite3
 conn = sqlite3.connect('database.db')
 print "Opened database successfully";
 conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)')
 print "Table created successfully";
 conn.close()

Flaskアプリケーションには3つのビュー関数があります。

最初のnew_student()関数は、URLルール(‘/addnew())。それにより、学生情報フォームを含むHTMLファイルが表示されます。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
@app.route('/enternew')
 def new_student():
     return render_template('student.html')

‘student.html’のHTMLスクリプトは以下の通りです -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Flaskサンプル</title>
 </head>
    <body>
     <form action="{{ url_for('addrec') }}" method="POST">
          <h3>学生情報</h3>
          名前
          <input type = "text" name = "nm" /></br>
          住所<br>
          <textarea name = "add" /><br>
          都市<br>
          <input type = "text" name = "city" /><br>
          郵便番号<br>
          <input type = "text" name = "pin" /><br>
          <input type = "submit" value = "提出" /><br>
       </form>
    </body>
 </html>

フォームデータはaddrec()関数にバインドされ、URL => ‘/addrec’ 。

このaddrec()関数はPOSTメソッドでフォームのデータを取得し、学生テーブルに挿入します。挿入操作の成功またはエラーに対応するメッセージは’result.html’に表示されます。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
@app.route('/addrec', methods = ['POST', 'GET'])
 def addrec():
     if request.method == 'POST':
        try:
           nm = request.form['nm']
           addr = request.form['add']
           city = request.form['city']
           pin = request.form['pin']
           with sql.connect("database.db") as con:
              cur = con.cursor()
              cur.execute("INSERT INTO students (name,addr,city,pin) 
                VALUES (?,?,?,?)",(nm,addr,city,pin) )
              con.commit()
              msg = "Record successfully added"
        except:
           con.rollback()
           msg = "error in insert operation"
        finally:
           return render_template("result.html", msg = msg)
           con.close()

result.html のHTMLスクリプトには、挿入操作結果を表示するエスケープ文{{msg}}が含まれています。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Flaskサンプル</title>
 </head>
    <body>
       操作結果 : {{ msg }}
       <h2><a href = "/">ホームページに戻る</a></h2>
    </body>
 </html>

このアプリケーションは、URL => ‘/list’は別のlist()関数を表します。この関数は、学生テーブルのすべてのレコードを含むMultiDictオブジェクトを「行」に詰め込みます。このオブジェクトはlist.htmlテンプレートに渡されます。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
@app.route('/list')
 def list():
     con = sql.connect("database.db")
     con.row_factory = sql.Row
     cur = con.cursor()
     cur.execute("select * from students
     rows = cur.fetchall(); 
     return render_template("list.html", rows=rows)

このlist.htmlはテンプレートで、行集合をループしてHTMLテーブルにデータを表示します。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Flaskサンプル</title>
 </head>
    <body>
       <table border = 1>
          thead>
             <td>名前</td>
             <td>住所</td>
             <td>都市</td>
             <td>コード</td>
          </thead>
          {% for row in rows %}
             tr>
                <td>{{row["name"]}}</td>
                <td>{{row["addr"]}}</td>
                <td>{{row["city"]}}</td>
                <td>{{row['pin']}}</td> 
             </tr>
          {% endfor %}
       </table>
       <a href = "}}/">ホームページに戻る</a>
    </body>
 </html>

最後に、URL => '/「規則表示する」home.html」をアプリケーションのエントリーポイントとして。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
@app.route('/)
 def home():
     return render_template('home.html')

ここにFlask-SQLiteアプリケーションの完全なコード。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by: ja.oldtoolbag.com
# Date : 2020-08-08
from flask import Flask, render_template, request
 import sqlite3 as sql
 import sqlite3
 app = Flask(__name__)
 @app.route('/)
 def home():
     return render_template('home.html')
 @app.route('/enternew')
 def new_student():
     return render_template('student.html')
 @app.route('/addrec', methods = ['POST', 'GET'])
 def addrec():
     if request.method == 'POST':
        try:
           nm = request.form['nm']
           addr = request.form['add']
           city = request.form['city']
           pin = request.form['pin']
           with sql.connect("database.db") as con:
              cur = con.cursor()
              cur.execute("INSERT INTO students (name,addr,city,pin) VALUES (?, ?, ?, ?)", (nm, addr, city, pin))
              con.commit()
              msg = "Record successfully added"
        except:
           con.rollback()
           msg = "error in insert operation"
        finally:
           return render_template("result.html", msg = msg)
           con.close()
 @app.route('/list')
 def list():
     con = sql.connect("database.db")
     con.row_factory = sql.Row
     cur = con.cursor()
     cur.execute("select * from students
     rows = cur.fetchall();
     return render_template("list.html", rows=rows)
 @app.route('/init())
 def init():
     conn = sqlite3.connect('database.db')
     print("データベースが正常にオープンされました")
     conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)')
     print("テーブルが正常に作成されました")
     conn.close()
     return None
 if __name__ == '__main__':
     app.run(debug=True)

Pythonシェルでこのスクリプトを実行し、開発サーバーが起動したときに実行します。アクセス: http:// localhost:5000/ ブラウザでこのような簡単なメニューを表示します -

クリック 「学生情報を追加」 リンクをクリックして、学生情報フォームを追加します。

フォームに記入し、送信してください。下層関数がそのレコードを学生テーブルに挿入します。

ホームページに戻り、「リストを表示」リンクをクリックして、サンプルデータのテーブルが表示されます。