Pythonでのデータベース操作を簡単に、かつ効率的に行うためにはSQLAlchemyというライブラリが非常に便利です。SQLAlchemyは、データベース操作を抽象化して扱えるORM(オブジェクトリレーショナルマッピング)機能を提供し、SQLの知識が少ない開発者でも簡単にデータベースとのやり取りができるようになります。本記事では、SQLAlchemyを使ったPythonでのデータベース操作の基本を紹介します。

SQLAlchemyとは?

SQLAlchemyは、Pythonでデータベース操作を行うためのライブラリで、特にORM機能が充実しています。ORMを使うと、データベースのテーブルやレコードをPythonのクラスやオブジェクトとして扱うことができ、SQLの文法をあまり意識せずにデータベース操作を行うことができます。 主な機能:

  • データベースと簡単に接続できる
  • テーブルをPythonクラスとして定義
  • データの挿入、取得、更新、削除をPythonコードで実行
  • 多様なデータベース(MySQL、PostgreSQL、SQLiteなど)に対応

SQLAlchemyのインストール

まずは、SQLAlchemyをインストールしましょう。以下のコマンドでインストールできます。

pip install sqlalchemy

さらに、SQLiteなどのデータベースを操作するために必要なドライバもインストールする必要があります。SQLiteの場合は特別な設定は不要ですが、MySQLを使う場合は以下のようにmysqlclientもインストールします。

pip install mysqlclient

データベースへの接続

SQLAlchemyを使ってデータベースに接続するには、create_engineを使います。今回はシンプルなSQLiteを使った例で進めます。

from sqlalchemy import create_engine
# SQLiteデータベースに接続(ファイルベース)
engine = create_engine('sqlite:///example.db', echo=True)

create_engineは、データベースの接続文字列を受け取り、データベースへの接続を管理します。上記のコードでは、SQLiteデータベース「example.db」を作成または接続し、echo=Trueを指定することで実行されるSQL文をコンソールに出力します。

テーブルの定義(クラスによる定義)

SQLAlchemyでは、データベースのテーブルはPythonのクラスとして定義します。このクラスにより、ORMがテーブルの構造を把握し、SQL文を自動生成してくれます。 まず、基本的なテーブルを定義してみましょう。

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
# ORMで使用するベースクラスの作成
Base = declarative_base()
# ユーザーテーブルの定義
class User(Base):
    __tablename__ = 'users'  # テーブル名
    id = Column(Integer, primary_key=True)  # 主キー
    name = Column(String, nullable=False)   # 名前(空は許可しない)
    age = Column(Integer)                   # 年齢
    def __repr__(self):
        return f"<User(name={self.name}, age={self.age})>"
  • declarative_base() は、テーブル定義のための基本クラスを生成します。
  • __tablename__ でテーブル名を指定します。
  • 各カラムは Column を使って定義し、データ型(Integer, Stringなど)とオプションを指定します。 このUserクラスは、データベースのusersテーブルに対応します。テーブルのカラムとしてid, name, ageが定義されており、idは主キーとして設定されています。

テーブルの作成

定義したテーブルをデータベースに反映させるためには、create_allメソッドを使います。

# データベースにテーブルを作成
Base.metadata.create_all(engine)

これで、usersテーブルがexample.dbというSQLiteデータベースに作成されます。

データの挿入(Create)

データベースに新しいレコードを挿入するには、まずセッションを開始し、ORMのオブジェクトを使ってデータを追加します。

from sqlalchemy.orm import sessionmaker
# セッションの作成
Session = sessionmaker(bind=engine)
session = Session()
# 新しいユーザーの追加
new_user = User(name="Alice", age=25)
session.add(new_user)  # セッションに追加
session.commit()       # データベースに保存

ここでは、新しいユーザー「Alice」を作成し、データベースに挿入しています。commitメソッドで変更を確定し、データベースに保存します。

データの取得(Read)

挿入したデータを取得するには、session.queryメソッドを使います。例えば、すべてのユーザーを取得する場合は次のようにします。

# ユーザーの全件取得
users = session.query(User).all()
for user in users:
    print(user)

また、特定の条件でデータを取得することもできます。例えば、名前が「Alice」のユーザーを取得する場合は以下のようにします。

# 名前がAliceのユーザーを取得
alice = session.query(User).filter_by(name="Alice").first()
print(alice)

データの更新(Update)

データを更新するには、まず変更したいオブジェクトを取得し、その属性を更新してからcommitを実行します。

# 名前がAliceのユーザーを取得し、年齢を更新
alice = session.query(User).filter_by(name="Alice").first()
alice.age = 26  # 年齢を更新
session.commit()  # データベースに反映

これにより、「Alice」の年齢が26に更新されます。

データの削除(Delete)

データを削除する場合は、対象のオブジェクトを取得してからdeleteメソッドを使います。

# 名前がAliceのユーザーを削除
alice = session.query(User).filter_by(name="Alice").first()
session.delete(alice)  # 削除
session.commit()       # データベースに反映

これにより、usersテーブルから「Alice」のデータが削除されます。

まとめ

SQLAlchemyを使うことで、SQL文を直接書かずにPythonコードを使って効率的にデータベース操作を行うことができます。今回は、SQLAlchemyを使った基本的なCRUD(Create, Read, Update, Delete)の操作方法を紹介しましたが、この ほかにも複雑なクエリやリレーション(テーブル間の関連)を定義することが可能です。 データベース操作が必要なPythonプロジェクトでは、SQLAlchemyを利用することで、コードの可読性を向上させ、効率的な開発を進めることができるでしょう。