PythonからプログラミングしてSQLite3を扱う
第3回で解説したPythonでWebアプリを作る基本を元に、Pythonを使ってSQLite3を実行してデータベースを読み書きし、Webブラウザに文字列や取得したデータを表示します。
まず「.htaccess」ファイルを用意します。同じディレクトリに「sql_insert_article.py」「sql_insert_comment.py」「sql_select_article.py」「sql_select_comment.py」をコーディングして実行します。macOSやLinuxでpyファイルをCGIとして実行するにはこれらのファイルにパーミッションで実行権限を与える必要があります。

AddHandler cgi-script .py DirectoryIndex index.py
レコードを挿入する
Pythonでデータベースを扱うにはデータファイルにコネクトし、CursorオブジェクトのカーソルでSQL文の文字列とその「?」に渡すデータを実行し、コネクトでコミットします。実際に使うデータであるレコード1行を「article」テーブルに挿入します。「datetime」モジュールは標準モジュールで日時を取得します。
#!C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe import sys import io import sqlite3 import datetime sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') con = sqlite3.connect('bezierbbs.db') cur = con.cursor() date = datetime.datetime.now() sql = 'INSERT INTO article(title,speaker,date,sentence,xy) VALUES (?,?,?,?,?)' data = ('一筆書きの「お絵描き掲示板」','たけし',date,'誰でも一筆書きできます。','400,200,400,200,200,500,200,500,600,500,600,500,400,200,400,200') cur.execute(sql,data) con.commit() print('''Content-Type: text/html; charset=utf-8\n\n テーブルに1行追加しました ''') cur.close() con.close()
サンプルコードの解説
シェバンの行はユーザー名をお使いのユーザー名に変更してください。またmacOSやLinuxでは「#!/usr/local/bin/python3.12」などになります。
モジュールを読み込みます。
文字コード「UTF-8」を適用します。
「connect」関数でデータである'bezierbbs.db'を読み込んでコネクトし、カーソルを取得します。
「datetime」関数の「now」メソッドで現在時間を取得します。
カーソルでSQL文の「sql」変数と、SQL文に渡すデータ「data」変数を引数にしてSQL文を実行(「execute」関数)し、コミット(「commit」関数)します。
Webブラウザに「テーブルに1行追加しました」を表示します。
カーソルとコネクトを閉じます。
#!C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe import sys import io import sqlite3 import datetime sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') con = sqlite3.connect('bezierbbs.db') cur = con.cursor() date = datetime.datetime.now() sql = 'INSERT INTO comment(article_id,speaker,date,sentence) VALUES (?,?,?,?)' # data = (1,'匿名',date,'誰でもアニメーションするワイヤーフレーム(針金の3Dオブジェクト)をWebブラウザ上でデザインすることができて、この「3Dお絵描き掲示板」で世界中の人に公開でき、コメントを書いたり書いてもらったりして交流することができます!') cur.execute(sql,data) con.commit() print('''Content-Type: text/html; charset=utf-8\n\n テーブルに1行追加しました ''') cur.close() con.close()
サンプルコードの解説
シェバンの行はユーザー名をお使いのユーザー名に変更してください。またmacOSやLinuxでは「#!/usr/local/bin/python3.12」などになります。
モジュールを読み込みます。
文字コードUTF-8を適用します。
connect関数でデータの'bezierbbs.db'を読み込んでコネクトし、カーソルを取得します。
datetime関数のnowメソッドで現在時間を取得します。
カーソルのSQL文のsql変数と、SQL文に渡すデータdata変数を引数にしてSQL文を実行(execute関数)し、コミット(commit関数)します。
Webブラウザに「テーブルに1行追加しました」を表示します。
カーソルとコネクトを閉じます。
レコードを取得する
'bezierbbs.db'ファイルにコネクトしカーソルを取得してSQL文「SELECT」を実行してレコードの一覧を取得しますが、ここではコミットしません。コミットはデータベースの書き換えが必要な場合にだけ実行し、読み込みだけの場合はコミットしません。
#!C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe import sys import io import sqlite3 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') con = sqlite3.connect('bezierbbs.db') cur = con.cursor() print('Content-Type: text/html; charset=utf-8\n\n') sql = 'SELECT * FROM article' for row in cur.execute(sql): print(row) cur.close() con.close()
サンプルコードの解説
シェバンの行はユーザー名をお使いのユーザー名に変更してください。またmacOSやLinuxでは「#!/usr/local/bin/python3.12」などになります。
モジュールを読み込みます。
文字コードUTF-8を適用します。
「connect」関数でデータの'bezierbbs.db'を読み込んでコネクトし、カーソルを取得します。
SQL文のsql変数を引数にし、カーソルのSQL文を実行(execute関数)します。
Webブラウザに取得した記事のリストを表示します。
カーソルとコネクトを閉じます。
#!C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe import sys import io import sqlite3 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') con = sqlite3.connect('bezierbbs.db') cur = con.cursor() print('Content-Type: text/html; charset=utf-8\n\n') sql = 'SELECT * FROM comment' for row in cur.execute(sql): print(row) cur.close() con.close()
サンプルコードの解説
シェバンの行はユーザー名をお使いのユーザー名に変更してください。またmacOSやLinuxでは「#!/usr/local/bin/python3.12」などになります。
モジュールを読み込みます。
文字コードUTF-8を適用します。
「connect」関数でデータの'bezierbbs.db'を読み込んでコネクトし、カーソルを取得します。
SQL文のsql変数を引数にし、カーソルのSQL文を実行(execute関数)します。
Webブラウザに取得したコメントのリストを表示します。
カーソルとコネクトを閉じます。
おわりに
今回はVisual Studio Codeを使ってデータベースに読み書きして、それを応用してPythonをプログラミングしてデータベースを読み書きしました。
次回はPythonでデータベースも利用して一筆書きBBSのアバウトページを表示する解説をします。