Pythonでsqlite3、クラスメソッドとスタティックメソッドを用いたデータベースにデータを追加する

スポンサーリンク

Pythonでsqlite3、クラスメソッドとスタティックメソッドを用いたデータベースにデータを追加してみます。

今回はsqlite3を用います。このライブラリはPythonの標準ライブラリで、事前にインストールする必要はありません。

■今回の環境(Python)

Google Colaboratory(Google Colab),2023年3月18日時点ではPython 3.9.16が用いられる。

■sqlite3、クラスメソッドとスタティックメソッドを用いたデータベースにデータを追加する

では、早速sqlite3、クラスメソッドとスタティックメソッドを用いたデータベースにデータを追加するコードを書いていきます。

■コード

import sqlite3

class Database:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)
        self.cur = self.conn.cursor()
        self.cur.execute("CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT, price REAL)")

    def add_item(self, name, price):
        self.cur.execute("INSERT INTO items VALUES (NULL, ?, ?)", (name, price))
        self.conn.commit()
        print(f"{name} added to database.")

    @classmethod
    def from_db_name(cls, db_name):
        return cls(db_name)

    @staticmethod
    def connect():
        conn = sqlite3.connect("example.db")
        cur = conn.cursor()
        return conn, cur

# データベース オブジェクトを作成する
db = Database.from_db_name("example.db")

# インスタンス メソッドを使用してアイテムをデータベースに追加する
db.add_item("apple", 1.5)

# 静的メソッドを使用してデータベースに接続する
conn, cur = Database.connect()

Databaseというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。このクラスは、継承を実現するための親クラスとなります。定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてdb_nameを設定します。なお、最初の「self(自己)」という引数,パラメータを介して、「conn」、「cur」というクラスのインスタンス変数が初期化され、それぞれSQLiteデータベースへの接続オブジェクトとカーソルオブジェクトが格納されます。これでSQLite3の接続オブジェクトとカーソルオブジェクトを、クラス内のどこからでも参照できるようになります。この時にself(自己)に対してドット演算子( . )を用いて「conn」、「cur」を指定します。さらに「execute()」を指定し、括弧内でSQL文を渡します。今回のSQL文は「CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT, price REAL)」となります。この文ではitemsという名前のテーブルを作成。テーブルには id、name、price という3つのカラムを作ります。またidはプライマリーキーであるため、一意の値が自動的に割り当てとなります。

コンストラクタを設定後、今後はクラス内にdef文を用いてadd_item()というメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3の引数,パラメータとしてnameとpriceを設定します。設定後、コンストラクタで設定したself.curとself.connをadd_item()メソッド内でも使用します。今回はexecute()を用いて新たなSQL文を渡します。それが「INSERT INTO items VALUES (NULL, ?, ?)”, (name, price)」です。itemsというテーブルに”NULL”を指定した”id”列と、”name”列と”price”列にそれぞれ引数,パラメータで渡された”name”と”price”の値を挿入するというものです。データの挿入となるため、self.connに対してcommit()を用いてデータベースへの変更を確定します。確定後、print()で文字列を出力します。

次に@classmethod デコレータを使って、from_db_nameというクラスメソッドを定義します。括弧内には、引数,パラメータとして第1にクラス自身を表す特殊なオブジェクトである「cls」を設定し、第2にdb_nameを設定します。このクラスメソッドが呼び出された時の処理として、引数,パラメータとして渡したdb_nameを使い、新しいインスタンスを作成し、それを返す処理となります。SQLiteDBクラスのインスタンスを作成する際に簡潔に記述することができます。

次に@staticmethod デコレータを使ってconnect()というスタティックメソッドを定義します。このスタティックメソッドが呼び出された時に実行される処理として、connという変数を定義し、その中でsqlite3.connect()を用いて今回はexample.dbというデータベースに接続します。接続した状態のものがconn変数に格納されます。またcurという変数を定義し、その中でconn.cursor()を用います。これでSQLiteを操作するためのカーソルというものを作成し、作成したものをcur変数に格納。格納後、connとcurを返すという処理になります。

スタティックメソッドを定義後、dbという変数を定義し、その中で作成したクラスであるDatabaseに対して(.)ドット演算子を用いてfrom_db_name()を呼び出し、括弧内にdb_nameとして今回はexample.dbを渡します。これでデータベース オブジェクトが作成されました。

作成後、作成されたオブジェクトであるdbに対して(.)ドット演算子を用いてadd_item()を呼び出し、括弧内に引数,パラメータとしてデータベースに追加するアイテムを渡します。今回はnameに渡す「apple」と、priceに渡す「1.5」を渡します。これでデータベース内にアイテムが追加されるようにします。

最後に「conn, cur = Database.connect()」と記述し、定義したスタティックメソッドを呼び出し、データベースに接続します。

■実行・検証

このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。

実行してみると、「apple added to database.」と出力されました。

出力後、フォルダを確認すると「example.dbというデータベース」が作成されていました。

このファイルを完全オンラインのデータベースビューアー(http://www.sqliteonline.net/)で確認すると今回データベースに追加されたアイテムが確認できました。

コメント

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