Flask-sqlite

提供:Dev Guides
移動先:案内検索

フラスコ– SQLite

Pythonには SQlite の組み込みサポートがあります。 SQlite3モジュールはPythonディストリビューションに同梱されています。 PythonでのSQLiteデータベースの使用に関する詳細なチュートリアルについては、リンク:/sqlite/sqlite_python [このリンク]を参照してください。 このセクションでは、FlaskアプリケーションとSQLiteの相互作用を確認します。

SQLiteデータベース*「database.db」*を作成し、その中に学生のテーブルを作成します。

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ファイルをレンダリングします。

@app.route('/enternew')
def new_student():
   return render_template('studentl')
*‘studentl’* のHTMLスクリプトは次のとおりです-
<html>
   <body>
      <form action = "{{ url_for('addrec') }}" method = "POST">
         <h3>Student Information</h3>
         Name<br>
         <input type = "text" name = "nm"/></br>

         Address<br>
         <textarea name = "add" ></textarea><br>

         City<br>
         <input type = "text" name = "city"/><br>

         PINCODE<br>
         <input type = "text" name = "pin"/><br>
         <input type = "submit" value = "submit"/><br>
      </form>
   </body>
</html>

ご覧のとおり、フォームデータは* addrec()関数をバインドする *’/addrec’ URLに投稿されます。

この* addrec()関数は、 *POST メソッドによってフォームのデータを取得し、studentsテーブルに挿入します。 挿入操作の成功またはエラーに対応するメッセージは ‘resultl’ にレンダリングされます。

@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("resultl",msg = msg)
         con.close()
*resultl* のHTMLスクリプトには、 *Insert* 操作の結果を表示するエスケープステートメント *\ {\ {msg}}* が含まれています。
<!doctype html>
<html>
   <body>
      result of addition : {{ msg }}
      <h2><a href = "\">go back to home page</a></h2>
   </body>
</html>

アプリケーションには、 ’/list’ URLで表される別の* list()関数が含まれています。 学生テーブル内のすべてのレコードを含む *MultiDict オブジェクトとして 'rows' を設定します。 このオブジェクトは listl テンプレートに渡されます。

@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("listl",rows = rows)

この listl はテンプレートであり、行セットを反復処理し、データをHTMLテーブルにレンダリングします。

<!doctype html>
<html>
   <body>
      <table border = 1>
         <thead>
            <td>Name</td>
            <td>Address>/td<
            <td>city</td>
            <td>Pincode</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 = "/">Go back to home page</a>
   </body>
</html>

最後に、 ‘/’ URLルールは、アプリケーションのエントリポイントとして機能する ‘homel’ をレンダリングします。

@app.route('/')
def home():
   return render_template('homel')
*Flask-SQLite* アプリケーションの完全なコードは次のとおりです。
from flask import Flask, render_template, request
import sqlite3 as sql
app = Flask(__name__)

@app.route('/')
def home():
   return render_template('homel')

@app.route('/enternew')
def new_student():
   return render_template('studentl')

@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("resultl",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("listl",rows = rows)

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

このスクリプトをPythonシェルから実行し、開発サーバーの実行を開始します。 ブラウザの http://localhost:5000/ にアクセスすると、次のようなシンプルなメニューが表示されます-

シンプルメニュー

*[新しいレコードを追加]* リンクをクリックして、*学生情報*フォームを開きます。

新しいレコードの追加

フォームフィールドに入力して送信します。 基礎となる関数は、学生テーブルにレコードを挿入します。

レコードが正常に追加されました

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

サンプルデータを示す表