この章では、Pythonを使用してデータベースを操作する方法を学びます。データベースは、アプリケーションがデータを永続的に保存、取得、更新するために使用されます。Pythonでは、SQLiteやMySQL、PostgreSQL、SQL Serverなど、さまざまなデータベースと簡単に連携できます。この章では、データベースへの接続方法、CRUD操作(作成、読み取り、更新、削除)、トランザクション管理など、データベース操作の基本を解説します。
14.1 SQL Serverへの接続とCRUD操作
まず、Pythonを使ってデータベースに接続し、基本的なCRUD操作を行う方法を学びます。データベースとの接続には、sqlite3
モジュールや、pyodbc
、MySQL Connector
、psycopg2
などの外部ライブラリを使用します。
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の使用方法を理解することで、データベースを扱うアプリケーションの開発が可能になります。次の章では、デリゲートとイベントについて学んだ知識を発展させ、非同期処理や並行プログラミングについて詳しく見ていきます。