概要
python からWEB検索する時に比較的たくさんのデータを一時的に蓄積する場合を想定して、 sqlite3 を使用してみました。 sqlite3 は、ローカル環境で使用できるデータベースファイルで手軽に使用できる利点があります。
sqlite3 は python の標準ライブラリで、特に追加インストールせず使用できます。使用方法を簡単にまとめておきます。
SQLite Browser
sqlite のデータベースファイルには、python プログラムから編集しますが、結果を確認したい時などに ブラウザー(エディター)があると 便利なので、“ DB Browser for SQLite ” というブラウザーを最初にインストールします。
今回、ダウンロードページのリスト項目の中の次のインストーラーをダウンロードし、インストールしました。
(PC環境:Windows10 Pro 64bit)
[ DB Browser for SQLite – Standard installer for 64-bit Windows ]
インストールは下記の手順です。
プログラミング(python)
① テーブル作成・データ書き込み
テーブル作成・データ書き込みプログラムは次の通りです。
# sqlite_00_create_table.py
# Windows10 Pro 64bit
# Python 3.8.3
import sqlite3
dbpath = 'db_sample.sqlite' # データベースファイルパス
connection = sqlite3.connect(dbpath) # データベース接続
# connection.isolation_level = None # 自動コミット時、コメントアウト解除
cursor = connection.cursor() # カーソル生成
# エラー処理(例外処理)
try:
# CREATE(テーブル生成)
cursor.execute("DROP TABLE IF EXISTS sample") # 既にテーブルが存在する場合削除
cursor.execute(
"CREATE TABLE IF NOT EXISTS sample (id INTEGER PRIMARY KEY, name TEXT)")
# INSERT(データ挿入)
cursor.execute("INSERT INTO sample VALUES (1, 'りんご')")
# プレースホルダの使用例
# 疑問符(qmark スタイル)と名前(named スタイル)の2方法
# 1つの場合、最後に“,”がないとエラー('みかん') → ('みかん',)
cursor.execute("INSERT INTO sample VALUES (2, ?)", ('みかん',))
cursor.execute("INSERT INTO sample VALUES (?, ?)", (3, 'ばなな'))
cursor.execute("INSERT INTO sample VALUES (:id, :name)",
{'id': 4, 'name': 'かき'})
# 複数レコード同時挿入
fruit_name = [
(5, 'なし'),
(6, 'ぶどう'),
]
cursor.executemany("INSERT INTO sample VALUES (?, ?)", fruit_name)
except sqlite3.Error as e:
print('sqlite3.Error occurred:', e.args[0])
connection.commit() # 処理実行
connection.close() # 接続を閉じる
“ DB Browser for SQLite ” でファイルを開き、テーブルが作成され、データが正しく書き込まれていることを確認します。
② データ検索
データ検索プログラムは次の通りです。検索結果の出力方法を幾つか変えてみました。
# sqlite_01_select.py
import sqlite3
db_path = "db_sample.sqlite" # DBファイルパス
tbl_nam = "sample" # テーブル名
sql = 'SELECT * FROM ' + tbl_nam + ' ORDER BY id DESC'
connection = sqlite3.connect(db_path) # DB接続
cursor = connection.cursor() # カーソル生成
print()
print('■ 未加工取得データ全出力 ■')
cursor.execute(sql)
res = cursor.fetchall()
print(res)
# ①配列
print()
print('■ ①配列 ■')
for idx_row in range(len(res)):
fetch_data = ""
for idx_col in range(len(res[idx_row])):
try:
fetch_data += res[idx_row][idx_col]
except:
fetch_data += str(res[idx_row][idx_col])
if(idx_col < len(res[idx_row]) - 1 ):
fetch_data += ' , '
print(fetch_data)
# ②iterator
print()
print('■ ②iterator ■')
for row in cursor.execute(sql):
print(row)
# ③fetchall()
print()
print('■ ③fetchall ■')
cursor.execute(sql)
for row in cursor.fetchall():
print(row)
# ④配列
print()
print('■ ④配列 ■')
for idx_row in range(len(res)):
fetch_data = ""
for idx_col in range(len(res[idx_row])):
try:
fetch_data += res[idx_row][idx_col]
except:
fetch_data += str(res[idx_row][idx_col])
if(idx_col < len(res[idx_row]) - 1 ):
fetch_data += ' , '
print(fetch_data)
connection.close() # DB接続解除
print()
結果は次の通りです。
③ データ更新・削除
データ更新・削除プログラムは次の通りです。
# sqlite_02_update.py
import sqlite3
import random
db_path = "db_sample.sqlite" # DBファイルパス
tbl_nam = "sample" # テーブル名
sql = 'SELECT * FROM ' + tbl_nam + ' ORDER BY id'
connection = sqlite3.connect(db_path) # DB接続
cursor = connection.cursor() # カーソル生成
cursor.execute(sql)
res = cursor.fetchall()
# ①更新前データ表示
print()
print('■ ①更新前データ ■')
cursor.execute(sql)
for row in cursor.fetchall():
print(row)
# 更新処理
cursor.execute("UPDATE " + tbl_nam + " SET name=? WHERE id=?" , ( "キュウイ" , 1 ,))
cursor.execute("UPDATE " + tbl_nam + " SET name=? WHERE id=?" , ( "ザクロ" , 3 ,))
connection.commit()
# ②更新後データ表示
print()
print('■ ②更新後データ ■')
cursor.execute(sql)
for row in cursor.fetchall():
print(row)
# 抹消処理
cursor.execute("DELETE FROM " + tbl_nam + " WHERE id>=?" , ( 5 ,))
connection.commit()
# ③抹消後データ表示
print()
print('■ ③抹消後データ ■')
cursor.execute(sql)
for row in cursor.fetchall():
print(row)
connection.close() # DB接続解除
print()
①更新前データに対して ②更新後データは、No1,No3 の果物名が変更されています。更に③抹消後データは、No5,No6 のデータが無くなっています。
まとめ
次回は、実際に Selenuim を使って、ホームページから取得したデータを sqlite3 データベースファイルに連続的に蓄積する処理をテストする予定です。