[8日間]Flask、Sqlite


1.学習内容


sqlite 3データベースの作成


glitchでのsqliteの使用
詳細については、sqlite tutorial公式ホームページ(https://www.sqlitetutorial.net/sqlite-commands/)を参照してください.
glitch terminalに「sqlite 3」と入力してsqliteを使用します.
sqlite3
.openでファイルを作成します.ファイル名は「db」です.「split 3」です.
.open db.split3
トピックテーブルを作成し、id、title、body列を作成します.
CREATE TABLE topics	(id INTEGER PRIMARY KEY, title TEXT NOT NULL, body TEXT);
テーブルを片付けてからテーブルによって作成されたテーブルのリストを表示できます.
.tables
トピックテーブルのschemaを決定します.
.schema topics
idはprimary keyによって作成されるのでtitleとbodyデータを挿入します.
INSERT INTO topics (title, body) VALUES ('sqlite', 'sqlite is..');
入力したデータを確認します.
SELECT * FROM topics;
テーブルがうまくいかなければ、DROPを行います.
DROP TABLE topics;
トピック・テーブルのデータを消去するときにDELETEを使用します.
DELETE FROM topics WHERE id=2;

Pythonを使用してデータベースを制御する

  • 「データベース」DBに接続し、トピック・テーブルのすべてのデータをselect文として出力します.
  • import sqlite3
    con = sqlite3.connect('database')
    cur = con.cursor()
    
    cur.execute('SELECT * FROM topics')
    topics = cur.fetchall()
    print(topics)
  • for文を使用してカラム別に出力することもできます.
  • import sqlite3
    con = sqlite3.connect('database')
    cur = con.cursor()
    for row in cur.execute('SELECT * FROM topics'):
      print(row)

    FlashでのSqliteの使用

  • テンプレートからdbに接続し、select文を使用してdbコンテンツをリストのコードに出力します.
    (変更のみ追加)
  • def template(content, id=None):
        conn = sqlite3.connect("test.db", isolation_level=None)
        cs = conn.cursor()
        cs.execute('SELECT * FROM topics')
        topics = cs.fetchall()
        conn.close()
    
        liTags = ''
        for topic in topics:
            liTags = liTags + f'<li><a href="/read/{topic[0]}">{topic[1]}</a></li>'
  • create formで追加し、create processにdbで挿入します.
    追加後、データを追加する最後のidのreadページに移動します.
    cursorにlastrowを尋ね、インポートします.
  • @app.route('/create_process/', methods=['POST'])
    def create_process():
        conn = sqlite3.connect('test.db')
        cs = conn.cursor()
        # global nextId
        getTitle = request.form['title']
        getBody = request.form['body']
    
        cs.execute('INSERT INTO topics (title, body) VALUES (?, ?)', (getTitle, getBody))
        id = cs.lastrowid
        conn.commit() # commit 전까지는 실제로 writing이 안 되고 있다.
        conn.close()
        return redirect(f'/read/{id}/')
  • delete fromマッチングidを使用して削除します.
  • @app.route("/delete/<int:id>/", methods=['POST'])
    def delete(id):
        conn = sqlite3.connect('test.db')
        cs = conn.cursor()
        cs.execute('DELETE FROM topics WHERE id=?', (id,))
        conn.commit()
        conn.close()
        return redirect('/')

    2.重要な内容

  • を追加、変更、削除すると接続されます.変更を反映するには()をコミットする必要があります.
  • SQLクエリー文を発行する場合は、f-stringではなくtuple形式でパラメータを送信する必要があります.
    1つのパラメータ:「DELETE FROMテーマWHERE ID=?」(id,)
    1つなら、追加するのはtupleの形で伝えるためです.
    2つのパラメータ:「INSERT INTOテーマ(title,body)VALuES(?,?)」(getTitle, getBody)
  • 3.勉強の心得


    リストでデータベースのように真似できますが、
    ページを再開すると、飛んでいって気分が悪くなるほか、違う部分で
    Databaseを使用することで解決できます.