PythonでSQLiteを使う:接続からデータ取得までの基本手順

Uncategorized
  • Pythonのsqlite3を初めて使用した(SQLもほとんど初めて)
  • 基本的な動かし方を確認
  • 一通り動作・書き方を確認するためのサンプルコードを作成、動きを確認
    • サンプルコードは各動作の疎結合を意識した

サンプルコード

import sqlite3
import os

# DBに接続
def open_db():
    # pyファイルと同階層を指定
    script_dir = os.path.dirname(os.path.abspath(__file__))
    db_path = os.path.join(script_dir, "example.db")

    # dbファイルに接続
    conn = sqlite3.connect(db_path)
    return conn

# DBの初期化
def init_db(conn):
    # 既存の users テーブルがあれば削除する
    conn.execute("DROP TABLE IF EXISTS users")

    # テーブル users を作成
    conn.execute(
        '''
        CREATE TABLE users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER
        )
        '''
    )

# サンプルデータの挿入
def insert_db(conn):
    # データの挿入
    conn.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
    conn.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))

    # 変更内容のコミット
    conn.commit()

# データの全件取得
def select_db(conn):
    rows = conn.execute(("SELECT id, name, age FROM users"))
    for row in rows:
        print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")

if __name__ == '__main__':
    # DBに接続
    with open_db() as conn:
        # DBの初期化
        init_db(conn)
        # サンプルデータの挿入
        insert_db(conn)
        # データの全件取得
        select_db(conn)

実行結果

  • 挿入したデータが表示される
ID: 1, Name: Alice, Age: 30
ID: 2, Name: Bob, Age: 25

コード解説

コードの構成

各操作を関数ごとにまとめることを意識した

  • DBに接続(open_db())
  • DBの初期化・テーブルの作成(init_db(conn))
  • データの挿入(insert_db(conn))
  • データの取得(select_db(conn))

DBに接続(open_db())

def open_db():
    # pyファイルと同階層を指定
    script_dir = os.path.dirname(os.path.abspath(__file__))
    db_path = os.path.join(script_dir, "example.db")

    # dbファイルに接続
    conn = sqlite3.connect(db_path)
    return conn
  • データベースexample.dbに接続
  • 指定のデータベースが無い場合は作成
  • 実行Pythonファイルと同じ階層を指定するため、os.pathを使ってパスを設定
  • データベース接続オブジェクトconnを返り値で返す

DBの初期化・テーブルの作成(init_db(conn))

def init_db(conn):
    # 既存の users テーブルがあれば削除する
    conn.execute("DROP TABLE IF EXISTS users")

    # テーブル users を作成
    conn.execute(
        '''
        CREATE TABLE users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER
        )
        '''
    )
  • conn.execute(【処理内容】)でクエリ処理を実行できる
  • テーブルusersを作成する
    • 既にある場合は削除してから作成
    • この処理を入れないと、後のデータ挿入で実行のたびに同じデータが増えるため、この処理を入れた
  • クエリ処理(テーブル作成) CREATE TABLE users ()
    • CREATE TABLE users ():テーブルusersを作成
    • ()でテーブル内容の定義
    • id INTEGER PRIMARY KEY AUTOINCREMENT
    • id:カラム名
    • INTEGER:整数型
    • PRIMARY KEY:このカラム(id)がメインのキー(ユニークになる)
    • AUTOINCREMENT:レコード追加で1つずつ増えた値が入る
    • name TEXT NOT NULL
    • name:カラム名
    • TEXT:テキスト型
    • NOT NULL:必ず値が入る(NULLを許容しない)
    • age INTEGER
    • age:カラム名
    • INTEGER:整数型

データの挿入(insert_db(conn))

def insert_db(conn):
    # データの挿入
    conn.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
    conn.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))

    # 変更内容のコミット
    conn.commit()
  • クエリ処理(データ挿入)INSERT INTO users (name, age) VALUES (?, ?)"
    • INSERT INTO users:テーブルusersに挿入
    • (name, age)nameageカラムに挿入
    • VALUES (?, ?)":値として後から指定した値が入る(プレースホルダーの使用)
    • 今回は('Alice', 30) ('Bob', 25)

データの取得(select_db(conn))

def select_db(conn):
    rows = conn.execute(("SELECT id, name, age FROM users"))
    for row in rows:
        print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")
  • クエリ処理(データの全件取得) SELECT id, name, age FROM users
    • テーブルusersからカラムid, name, ageの値を取得
  • for文で1セットずつ取り出して出力

まとめ

  • クエリ処理は効率的な処理や大規模の処理など、工夫する点はたくさんあるが、今回は基本的な処理の確認のみ実施
    • 簡単なクエリの書き方
    • Pythonから使用する方法
  • アプリケーションに使用する際には、さらに工夫すべき点があると思うので、そこは作りながら学びたい

コメント

タイトルとURLをコピーしました