PYTHON で SQLITE3 を使う

概要

 python からWEB検索する時に比較的たくさんのデータを一時的に蓄積する場合を想定して、 sqlite3 を使用してみました。 sqlite3 は、ローカル環境で使用できるデータベースファイルで手軽に使用できる利点があります。
 sqlite3 は python の標準ライブラリで、特に追加インストールせず使用できます。使用方法を簡単にまとめておきます。

SQLite Browser

 sqlite のデータベースファイルには、python プログラムから編集しますが、結果を確認したい時などに ブラウザー(エディター)があると 便利なので、“ DB Browser for SQLite ” というブラウザーを最初にインストールします。

引用 : DB Browser for SQLite( https://sqlitebrowser.org/ )

 今回、ダウンロードページのリスト項目の中の次のインストーラーをダウンロードし、インストールしました。
 (PC環境:Windows10 Pro 64bit)
[ DB Browser for SQLite – Standard installer for 64-bit Windows ]

 引用(ダウンロードページ) : https://sqlitebrowser.org/dl/

 インストールは下記の手順です。

  

プログラミング(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 データベースファイルに連続的に蓄積する処理をテストする予定です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です