PythonでのDB操作:SQLAlchemyでSQLiteに接続して操作する方法

Pythonでデータベースを操作する場合、SQLAlchemyを使ってSQLiteに接続する方法があります。SQLAlchemyはPythonで最も人気のあるORM(Object-Relational Mapping)の一つであり、多くのデータベースに対応しています。

ここでは、SQLAlchemyを使用してPythonからSQLiteに接続して、データベースを操作する方法を説明します。

ライブラリのインポート

まず、必要なライブラリをインポートします。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLiteデータベースへの接続

SQLiteデータベースに接続するために、 create_engine() を使用します。

engine = create_engine('sqlite:///example.db', echo=True)

上記の例では、SQLiteのデータベースファイル example.db に接続しています。 echo=True を指定すると、SQLAlchemyが発行するSQL文がコンソールに表示されます。

テーブルの作成

モデルクラスを作成します。データベースのテーブルは、このクラスを継承して作成されます。

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

上記の例では、 User クラスが作成されています。 __tablename__ 属性には、テーブル名を指定します。 idnameage の3つのカラムを定義しています。

次に、データベースのテーブルを作成するために、 Base.metadata.create_all() を使用します。

Base.metadata.create_all(engine)

これで、SQLiteのデータベースに接続して、テーブルを作成する準備が整いました。次に、データを操作する方法を説明します。

データの挿入

データを追加するには、セッションを作成し、 add() メソッドを使用して新しいオブジェクトを作成し、データベースに追加します。

Session = sessionmaker(bind=engine)
session = Session()

user = User(name='John', age=25)
session.add(user)

session.commit()

上記の例では、 User クラスの新しいオブジェクトを作成して、データベースに追加しています。 session.commit() を呼び出すことで、データベースへの変更を確定します。

データの取得

データを取得するには、 query() メソッドを使用します。

users = session.query(User).all()

for user in users:
    print(user.name, user.age)

上記の例では、 User クラスからすべてのオブジェェクトを取得して、 for ループで各オブジェクトの nameage を表示しています。

データの更新

データを更新するには、 query() メソッドでオブジェクトを取得し、プロパティを変更してから、 commit() メソッドを呼び出します。

user = session.query(User).filter_by(name='John').first()
user.age = 30

session.commit()

上記の例では、 name が 'John' の最初のオブジェクトを取得し、 age を 30 に更新しています。

データの削除

データを削除するには、 query() メソッドでオブジェクトを取得し、 delete() メソッドを呼び出します。

user = session.query(User).filter_by(name='John').first()
session.delete(user)

session.commit()

上記の例では、 name が 'John' の最初のオブジェクトを取得し、削除しています。

発生する可能性のあるエラーと対処法

SQLAlchemyを使用してSQLiteデータベースを操作する際に発生する可能性がある一般的なエラーと、それらのエラーに対処する方法を以下に示します。

データベースに接続できないエラー

OperationalError: (sqlite3.OperationalError) unable to open database file

このエラーは、指定されたパスにSQLiteデータベースが存在しない場合に発生することがあります。また、SQLiteデータベースにアクセスするための適切な権限がない場合にも発生することがあります。

対処法

  • パスを確認して、存在しない場合は、指定した場所にSQLiteデータベースを作成する必要があります。
  • 適切な権限があるか確認する必要があります。データベースファイルにアクセスできるように、アクセス許可を変更する必要がある場合があります。

テーブルが存在しないエラー

OperationalError: (sqlite3.OperationalError) no such table: users

このエラーは、指定されたテーブルが存在しない場合に発生することがあります。

対処法

  • テーブルが存在するかどうかを確認する必要があります。存在しない場合は、テーブルを作成する必要があります。

データベースがロックされているエラー

OperationalError: (sqlite3.OperationalError) database is locked

このエラーは、同時に複数のプロセスまたはスレッドがデータベースにアクセスしようとした場合に発生することがあります。

対処法

  • 他のプロセスまたはスレッドがデータベースにアクセスしていないことを確認してください。
  • 接続を閉じることができない場合は、一定時間待つ必要がある場合があります。

データベースのインデックスエラー

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id xxxxxxxx and this is thread id xxxxxxxx

このエラーは、SQLiteデータベースに関するスレッド/プロセス問題が原因で発生することがあります。

対処法

スレッド/プロセスを同期化する必要がある場合があります。これには、SQLiteコネクションプールを使用することができます。また、SQLiteの場合、同じスレッド/プロセスでオブジェクトを使用するように注意する必要があります。

データの挿入エラー

IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: users.username

このエラーは、一意の値を持つ列に重複する値が挿入された場合に発生することがあります。

対処法

  • 重複する値を挿入する前に、データベース内の値を確認する必要があります。また、一意の制約を使用することで、重複する値が挿入されないようにすることもできます。

まとめ

以上が、PythonSQLiteデータベースを操作するためのSQLAlchemyを使用する方法です。SQLAlchemyは、他の多くのデータベースにも対応していますので、他のデータベースでも同様に利用することができます。Pythonを利用したシステム開発の学習には下記のような講座の利用が有効です。

click.linksynergy.com

click.linksynergy.com