## Codebase Patterns
- executemany follows the same pattern as execute(): open cursor context manager, call method, map exceptions via raise_mapped_connector_error
- Tests use MagicMock with __enter__/__exit__ on cursor() return value to mock the cursor context manager
- venv is at `venv/` (not `python-db-connector-env/`)

# Ralph Progress Log
Started: Thu Apr  2 19:59:55 -03 2026
---

## 2026-04-02 - US-001
- Implemented `SyncClient.executemany(query, params_seq)` in `src/db_connector/sync_client.py`
- Added 3 tests to `tests/test_sync_client.py`: delegates to cursor.executemany, maps exceptions, handles empty params_seq
- Files changed: `src/db_connector/sync_client.py`, `tests/test_sync_client.py`
- **Learnings for future iterations:**
  - The venv is at `venv/` not `python-db-connector-env/`
  - All new query methods follow the same pattern: `with self._connection.cursor() as cur:` then call method, wrap in try/except with `raise_mapped_connector_error`
---

## 2026-04-02 - US-002
- Implemented `AsyncClient.executemany(query, params_seq)` in `src/db_connector/async_client.py`
- Added 3 tests to `tests/test_async_client.py`: delegates to cursor.executemany, maps exceptions, handles empty params_seq
- Files changed: `src/db_connector/async_client.py`, `tests/test_async_client.py`
- **Learnings for future iterations:**
  - Async tests use `AsyncMock` for cursor methods; mock cursor context is set up via `make_cursor_ctx()` helper already in the test file
---

## 2026-04-02 - US-003
- Added Batch Operations section to `README.md` after the Transactions section with sync and async examples
- Bumped version from 0.1.1 to 0.2.0 in `pyproject.toml`
- Files changed: `README.md`, `pyproject.toml`
- **Learnings for future iterations:**
  - Version is in pyproject.toml `version` field under `[project]`
---
