claude-memory/graph/fixes/fix-sqlx-in-memory-sqlite-pool-requires-max-connections1-1b71b1.md

60 lines
2.0 KiB
Markdown

---
id: 1b71b163-b56f-4226-9731-a76ef245e532
type: fix
title: "Fix: sqlx in-memory SQLite pool requires max_connections=1"
tags: [sba-scouting, rust, sqlx, sqlite, testing, fix, in-memory]
importance: 0.8
confidence: 0.8
created: "2026-03-02T02:08:46.895029+00:00"
updated: "2026-03-02T02:08:47.223687+00:00"
relations:
- target: e5ec55be-ced4-4c30-8390-940b45dc2ed5
type: RELATED_TO
direction: outgoing
strength: 0.66
edge_id: 23a340f1-7bcf-471d-ae78-e4ef9efc73f8
- target: e895864f-9e9c-47e3-a95b-5c065ee0aae5
type: RELATED_TO
direction: outgoing
strength: 0.62
edge_id: 1403f29d-908b-4912-a04d-3950a761f980
- target: 893cf251-0ce1-43fa-9776-e88c0f3cd566
type: RELATED_TO
direction: outgoing
strength: 0.61
edge_id: 5d2f8ff7-bdc0-4103-b143-212d9eca9e40
---
# sqlx In-Memory SQLite Pool: max_connections Must Be 1
## Problem
Integration tests using `:memory:` SQLite failed with "no such table" errors after wrapping `create_tables` in a transaction.
## Root Cause
With `max_connections > 1`, each connection in the pool gets its own separate in-memory database. A transaction on connection A (e.g. `pool.begin()` for `create_tables`) is invisible to queries on connection B. In-memory SQLite databases are per-connection — there is no shared state across connections.
## Fix
Detect `:memory:` path and force `max_connections(1)`. Also skip WAL journal mode for in-memory DBs (WAL requires a file).
```rust
let pool = if db_path == ":memory:" {
SqlitePoolOptions::new()
.max_connections(1)
.connect(":memory:")
.await?
} else {
SqlitePoolOptions::new()
.max_connections(5)
.connect(&format!("sqlite:{db_path}"))
.await?
};
// Only set WAL for file-backed DBs
if db_path != ":memory:" {
sqlx::query("PRAGMA journal_mode=WAL").execute(&pool).await?;
}
```
## Impact
All 5 integration tests were broken until this was applied. Applies to any test setup using `create_tables` inside a transaction with a shared pool.