Coverage for src/inheritance_calculator_core/database/base.py: 0%
47 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-17 05:31 +0900
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-17 05:31 +0900
1"""データベース層の基底クラスとインターフェース"""
2from abc import ABC, abstractmethod
3from typing import Generic, TypeVar, Optional, List, Any
4from uuid import UUID
7T = TypeVar('T')
10class Repository(ABC, Generic[T]):
11 """リポジトリパターンの基底クラス"""
13 @abstractmethod
14 async def create(self, entity: T) -> T:
15 """
16 エンティティを作成
18 Args:
19 entity: 作成するエンティティ
21 Returns:
22 作成されたエンティティ
24 Raises:
25 DatabaseConnectionError: データベース接続エラー
26 ValidationError: バリデーションエラー
27 """
28 pass
30 @abstractmethod
31 async def get_by_id(self, entity_id: UUID) -> Optional[T]:
32 """
33 IDでエンティティを取得
35 Args:
36 entity_id: エンティティID
38 Returns:
39 エンティティ(存在しない場合はNone)
41 Raises:
42 DatabaseConnectionError: データベース接続エラー
43 """
44 pass
46 @abstractmethod
47 async def update(self, entity: T) -> T:
48 """
49 エンティティを更新
51 Args:
52 entity: 更新するエンティティ
54 Returns:
55 更新されたエンティティ
57 Raises:
58 DatabaseConnectionError: データベース接続エラー
59 ValidationError: バリデーションエラー
60 """
61 pass
63 @abstractmethod
64 async def delete(self, entity_id: UUID) -> bool:
65 """
66 エンティティを削除
68 Args:
69 entity_id: エンティティID
71 Returns:
72 削除成功の場合True
74 Raises:
75 DatabaseConnectionError: データベース接続エラー
76 """
77 pass
79 @abstractmethod
80 async def list_all(self, limit: Optional[int] = None, offset: int = 0) -> List[T]:
81 """
82 全エンティティを取得
84 Args:
85 limit: 取得件数制限
86 offset: 取得開始位置
88 Returns:
89 エンティティのリスト
91 Raises:
92 DatabaseConnectionError: データベース接続エラー
93 """
94 pass
97class DatabaseClient(ABC):
98 """データベースクライアントの基底クラス(同期版)
100 Note:
101 現在の実装ではNeo4jの同期ドライバーを使用しているため、
102 すべてのメソッドは同期版として定義されています。
103 将来的に非同期対応が必要になった場合は、
104 AsyncDatabaseClientクラスを別途定義することを推奨します。
105 """
107 @abstractmethod
108 def connect(self) -> None:
109 """
110 データベースに接続
112 Raises:
113 DatabaseConnectionError: 接続エラー
114 """
115 pass
117 @abstractmethod
118 def disconnect(self) -> None:
119 """
120 データベース接続を切断
122 Raises:
123 DatabaseConnectionError: 切断エラー
124 """
125 pass
127 @abstractmethod
128 def execute_query(
129 self,
130 query: str,
131 parameters: Optional[dict[str, Any]] = None
132 ) -> Any:
133 """
134 クエリを実行
136 Args:
137 query: 実行するクエリ
138 parameters: クエリパラメータ
140 Returns:
141 クエリ実行結果
143 Raises:
144 DatabaseConnectionError: 実行エラー
145 """
146 pass
148 @abstractmethod
149 def health_check(self) -> bool:
150 """
151 ヘルスチェック
153 Returns:
154 正常な場合True
156 Raises:
157 DatabaseConnectionError: 接続エラー
158 """
159 pass
161 @abstractmethod
162 def begin_transaction(self) -> Any:
163 """
164 トランザクションを開始
166 Returns:
167 トランザクションオブジェクト
169 Raises:
170 DatabaseConnectionError: トランザクション開始エラー
171 """
172 pass
174 @abstractmethod
175 def commit_transaction(self, transaction: Any) -> None:
176 """
177 トランザクションをコミット
179 Args:
180 transaction: トランザクションオブジェクト
182 Raises:
183 DatabaseConnectionError: コミットエラー
184 """
185 pass
187 @abstractmethod
188 def rollback_transaction(self, transaction: Any) -> None:
189 """
190 トランザクションをロールバック
192 Args:
193 transaction: トランザクションオブジェクト
195 Raises:
196 DatabaseConnectionError: ロールバックエラー
197 """
198 pass
200 def __enter__(self) -> "DatabaseClient":
201 """コンテキストマネージャーの開始"""
202 self.connect()
203 return self
205 def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
206 """コンテキストマネージャーの終了"""
207 self.disconnect()