claude-memory/graph/fixes/fix-sqlx-in-memory-sqlite-pool-requires-max-connections1-1b71b1.md
2026-03-01 20:20:58 -06:00

2.6 KiB

id type title tags importance confidence created updated relations
1b71b163-b56f-4226-9731-a76ef245e532 fix Fix: sqlx in-memory SQLite pool requires max_connections=1
sba-scouting
rust
sqlx
sqlite
testing
fix
in-memory
0.8 0.8 2026-03-02T02:08:46.895029+00:00 2026-03-02T02:20:58.504326+00:00
target type direction strength edge_id
e5ec55be-ced4-4c30-8390-940b45dc2ed5 RELATED_TO outgoing 0.66 23a340f1-7bcf-471d-ae78-e4ef9efc73f8
target type direction strength edge_id
e895864f-9e9c-47e3-a95b-5c065ee0aae5 RELATED_TO outgoing 0.62 1403f29d-908b-4912-a04d-3950a761f980
target type direction strength edge_id
893cf251-0ce1-43fa-9776-e88c0f3cd566 RELATED_TO outgoing 0.61 5d2f8ff7-bdc0-4103-b143-212d9eca9e40
target type direction strength edge_id
ed3e8fe6-5947-4022-96dc-dd4504ffa1a1 FOLLOWS outgoing 0.8 4c67b35b-1ebc-4bd6-a058-d1de16514fe0
target type direction strength edge_id
d75e2afd-8348-4fe6-9ea1-731604505aa6 FOLLOWS incoming 0.8 7d49db13-70e0-46d9-8707-fc0ddfe2df85
target type direction strength edge_id
d75e2afd-8348-4fe6-9ea1-731604505aa6 CAUSES incoming 0.9 090ec7e1-c8fc-40f5-8d60-4b2aef56bcbd
target type direction strength edge_id
77c0b897-4124-432f-84de-700ff82dcde1 RELATED_TO outgoing 0.75 863714f3-635e-427a-a1fb-499b14b192e8

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).

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.