第14章: データベース操作

database-operations

この章では、Pythonを使用してデータベースを操作する方法を学びます。データベースは、アプリケーションがデータを永続的に保存、取得、更新するために使用されます。Pythonでは、SQLiteやMySQL、PostgreSQL、SQL Serverなど、さまざまなデータベースと簡単に連携できます。この章では、データベースへの接続方法、CRUD操作(作成、読み取り、更新、削除)、トランザクション管理など、データベース操作の基本を解説します。

目次

14.1 SQL Serverへの接続とCRUD操作

まず、Pythonを使ってデータベースに接続し、基本的なCRUD操作を行う方法を学びます。データベースとの接続には、sqlite3モジュールや、pyodbcMySQL Connectorpsycopg2などの外部ライブラリを使用します。

SQLiteデータベースの接続とCRUD操作

SQLiteは、Pythonに標準で搭載されている軽量のデータベースです。ここでは、SQLiteを使った基本的なデータ操作を紹介します。

import sqlite3

# データベースに接続なければ作成
conn = sqlite3.connect('example.db')

# カーソルの作成
cur = conn.cursor()

# テーブルの作成
cur.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER
    )
''')

# データの挿入
cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))

# データの読み込み
cur.execute("SELECT * FROM users")
rows = cur.fetchall()
for row in rows:
    print(row)

# データの更新
cur.execute("UPDATE users SET age = ? WHERE name = ?", (31, 'Alice'))

# データの削除
cur.execute("DELETE FROM users WHERE name = ?", ('Alice',))

# コミットして変更を保存
conn.commit()

# 接続を閉じる
conn.close()

この例では、SQLiteデータベースに接続し、ユーザー情報を格納するテーブルを作成データの挿入読み取り更新削除を行っています。

14.2 Entity Frameworkの基礎

PythonにはC#のEntity Frameworkのような強力なORM(オブジェクト・リレーショナル・マッピング)ツールはありませんが、同様の機能を提供するSQLAlchemyがあります。SQLAlchemyを使用すると、Pythonオブジェクトをデータベースにマッピングし、SQL文を直接書かなくてもデータベース操作が可能です。

SQLAlchemyの基本的な使用法

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

# データベースエンジンの作成
engine = create_engine('sqlite:///example.db')
Base = declarative_base()

# テーブルの定義
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# データベースの初期化
Base.metadata.create_all(engine)

# セッションの作成
Session = sessionmaker(bind=engine)
session = Session()

# データの挿入
new_user = User(name='Bob', age=25)
session.add(new_user)
session.commit()

# データの読み取り
users = session.query(User).all()
for user in users:
    print(user.name, user.age)

この例では、SQLAlchemyを使用して、PythonオブジェクトをSQLiteデータベースにマッピングし、ユーザー情報を操作しています。

14.3 LINQ to SQLの使い方

Pythonでは、C#のLINQに直接対応する機能はありませんが、SQLAlchemyのクエリ機能やリスト内包表記を使って、同様のクエリ操作が可能です。

SQLAlchemyを使ったクエリの例

# 年齢が30以上のユーザーを取得
users_over_30 = session.query(User).filter(User.age >= 30).all()
for user in users_over_30:
    print(user.name, user.age)

14.4 トランザクション管理と同時実行制御

データベース操作では、トランザクション管理が重要です。トランザクションは、データの一貫性を保つために、一連の操作をまとめて実行し、途中で失敗した場合はすべてをロールバックします。

トランザクションの使用例

try:
    # データの挿入
    cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Charlie', 35))

    # コミットして変更を保存
    conn.commit()
except sqlite3.Error as e:
    # エラーが発生した場合はロールバック
    conn.rollback()
    print(f"Error: {e}")
finally:
    # 接続を閉じる
    conn.close()

このコードでは、トランザクションを使って、エラーが発生した場合にデータベースの状態をロールバックしています。

14.5 データベースとC#の統合テスト

Pythonでも、データベース操作に対する単体テストや統合テストを行うことができます。unittestモジュールを使って、データベース操作をテストする方法を紹介します。

統合テストの例

import unittest
import sqlite3

class TestDatabase(unittest.TestCase):

    def setUp(self):
        # テスト用データベースを作成
        self.conn = sqlite3.connect(':memory:')
        self.cur = self.conn.cursor()
        self.cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')

    def tearDown(self):
        # テスト後にデータベースを閉じる
        self.conn.close()

    def test_insert_user(self):
        # データの挿入テスト
        self.cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
        self.cur.execute("SELECT * FROM users WHERE name=?", ('Alice',))
        user = self.cur.fetchone()
        self.assertEqual(user[1], 'Alice')

if __name__ == '__main__':
    unittest.main()

このテストでは、unittestモジュールを使って、ユーザーの挿入とデータ取得をテストしています。

まとめ

この章では、Pythonを使ったデータベース操作の基本を学びました。データベースへの接続やCRUD操作、トランザクション管理、ORMの使用方法を理解することで、データベースを扱うアプリケーションの開発が可能になります。次の章では、デリゲートとイベントについて学んだ知識を発展させ、非同期処理や並行プログラミングについて詳しく見ていきます。

目次