[python 05]SQLiteバインド-入力、削除、変更


Review


表にデータを入力

INSERT INTO topics (title, body) VALUES ('SQLite', 'SQLite is ...');

テーブルでのデータの表示

SELECT * FROM topics;

入力されたデータの出力が良好であることがわかります.

PythonでSQLiteをバインドする

import sqlite3
conn = sqlite3.connect('db.sqlite3')
cursor = conn.cursor()
PythonにはSQLiteが内蔵されており、単独でインストールすることなく導入できます.
sqlite.connect()関数を使用してデータベースファイルを開き、cursorを設定します.

PythonでSQLiteクエリーを実行する

cursor.execute('SELECT * FROM topics;')
topics = cursor.fetchall()
cursor.クエリーはexecute()関数を使用して実行できます.cursorは、クエリーを実行した結果の一番前にあります.cursor.fetchall()関数を使用して、すべてのコンテンツをインポートできます.
このようにして持ってきた情報を印刷します.
print(topics)
構文をpythonファイルに追加し、端末が作成したばかりのpythonファイルを実行します.

テーマのDBは内容が良いです.

トピック(Topics)テーブルを読み込みます。py

import sqlite3
conn = sqlite3.connect('db.sqlite3')
cursor = conn.cursor()
cursor.execute('SELECT * FROM topics;')
topics = cursor.fetchall()
for topic in topics:
  print(topic[0], topic[1])
conn.close()

出力がいい.

トピックテーブルにcreateを入力します。py

import sqlite3
conn = sqlite3.connect('db.sqlite3')
cursor = conn.cursor()

title = input('title : ')
body = input('body : ')

cursor.execute('INSERT INTO topics (title, body) VALUES (?, ?);', (title, body))
conn.commit()
conn.close()

import read
最後にimport readを入力し、入力後すぐに表の内容を出力します.

server.SQLiteをpyにバインドする


各関数はsqlite接続を作成します.conn.close()で閉じるのを忘れないでください.template()関数には、次の内容が記述されています.
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('SELECT * FROM topics')
  topics = cursor.fetchall()
  conn.close()
情報をtupleとして受信し、出力部をdictionaryではなくtupleの構文に適合するようにtopic[0]、topic[1]に入れる.
  for topic in topics:
    liTags += f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'
read関数は、対応する番号の投稿内容を取得するように記述されます.
def read(num):
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('SELECT * FROM topics WHERE id=?', (num,))
  topic = cursor.fetchone()
  conn.close()
  content = f'<h2>{topic[1]}</h2>{topic[2]}'
  return template(content, num)
(num,)カンマをつけるのは、(num)をひっくり返すと数字(num,)をひっくり返すとtupleになるからです.
トップページ

投稿をクリックするとき

Insert関数の作成


既存のinsertは、グローバル変数リストのトピックにアイテムを追加し、SQLite DBに接続したので、DBに保存するように変更してみました.
@app.route("/create_process/", methods=['POST'])
def create_process():
  title = request.form['title']
  body = request.form['body']
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('INSERT INTO topics (title, body) VALUES (?,?)',(title, body))
  nextId = cursor.lastrowid
  conn.commit()
  conn.close()
  return redirect(f'/read/{nextId}')
最初はSELECT関数で最後のid値を取得、cursorに符号化します.最後の行のid値を取得するためにlastrowidという優れた内蔵変数が存在します.


入力が正しいことを確認できます.

Delete関数の作成

@app.route('/delete/<int:num>/')
def delete(num):
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('DELETE FROM topics WHERE id=?', (num,))
  conn.commit()
  conn.close()
  return template(f'<h2>Delete Succeeded</h2>Content number {num} deleted.')
Delete関数も実現した.
デモの削除


hBase記事が削除されたことを確認できます.運転がよい.
(変更されたデザインは、ガイドバーを使用してボタンのプロパティを変更し、突然CSS復習を行う...)
こうして2週間のネット入門教育を終えた.

Challenge


Modify機能の実装


放課後、投稿を修正する機能も実現した.CreateとDeleteを適当に混ぜ合わせればいいので、難しくはありません.
@app.route('/modify/<int:num>/')
def modify(num):
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('SELECT * FROM topics WHERE id=?', (num,))
  topic = cursor.fetchone()
  conn.close()
  content = f'''
  <h2>Modify</h2>let\'s modify!<br>
  <form action="/modify_process/{num}/" method="POST">
    <p><input type="text" name="title" value="{topic[1]}"></p>
    <p><textarea name="body">{topic[2]}</textarea></p>
    <p><input type="submit" value="수정"></p>
  </form>
  '''
  return template(content)

@app.route("/modify_process/<int:num>/", methods=['POST'])
def modify_process(num):
  title = request.form['title']
  body = request.form['body']
  conn = sqlite3.connect('db.sqlite3')
  cursor = conn.cursor()
  cursor.execute('UPDATE topics SET title = ?, body = ? WHERE id=?',(title, body, num))
  conn.commit()
  conn.close()
  return redirect(f'/read/{num}')
modify()とmodify process()を記述した.
modify()にはcreate()のような変更された画面が表示されますが、作成したコンテンツを入力ウィンドウに表示します.
modify process()はcreate process()にも似ており、num日数をパラメータとし、id値に対応するrowをUPDATEとして実現している.

DB 2投稿で「修正」ボタンをクリックします.

以上のような修正画面が表示されます.
変更後は[修正](Modify)ボタンをクリックします.


内容が変更されたことを確認できます.

? Question


受信した情報をテーブル構造に基づいてdictionaryに整理できますか?


データを受信してid、title、bodyにアクセスする場合、topice[0]、topice[1]のようなインデックス値を使用してアクセスすることは危険です.辞書に変換する機能が必要なようです.

! Answer


row factory。

conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute('select * from topics')

result = cursor.fetchall()
そうするとdictionaryからなるlistに戻ります.

Comment


今日ロイゴル先生の授業は終わりました.2週間は感情があったようですが、最後になって残念に思います.久しぶりにWebに触れて、ずいぶん変わってきました(javascriptのlet、const、Flaskなど…)これは私が長い間手を放していたことに気づいて謙虚になった時間です.いずれにしても、私は自分の手で似たようなサイトを作ったことを喜んでいます.なんと投稿登録削除を変更できるホームページです!githubにはHTML、CSS、JavaScriptなどの静的ページしか載せられないので、Flashで作成した動的Webはどこに置けばいいのでしょうか?Glitchは毎月8ドルで24時間サービスできると言っていますが、いいものができたら利用してもいいです.

Link


Glitchコード
Glitch Live Site(24時間管理外)