nautechsystems/nautilus_trader · error
Failed to insert into order_position_index table: {e}
Error message
Failed to insert into order_position_index table: {e} What it means
index_order_position wraps any sqlx error from inserting a (client_order_id, position_id) row into the `order_position_index` table in anyhow. It means the mapping write failed at the database layer — schema mismatch, missing table, or connection problem. The typed sqlx error is preserved as the anyhow error source.
Source
Thrown at crates/infrastructure/src/sql/queries.rs:1535
sqlx::query(
r#"
INSERT INTO "order_position_index" (
client_order_id, position_id, created_at, updated_at
) VALUES (
$1, $2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
)
ON CONFLICT (client_order_id)
DO UPDATE
SET
position_id = $2, updated_at = CURRENT_TIMESTAMP
"#,
)
.bind(client_order_id.to_string())
.bind(position_id.to_string())
.execute(pool)
.await
.map(|_| ())
.map_err(|e| anyhow::anyhow!("Failed to insert into order_position_index table: {e}"))
}
/// Loads the order ID to position ID index via the provided `pool`.
///
/// # Errors
///
/// Returns an error if the SQL SELECT or iteration fails.
pub async fn load_index_order_position(
pool: &PgPool,
) -> anyhow::Result<AHashMap<ClientOrderId, PositionId>> {
let mut map: AHashMap<ClientOrderId, PositionId> = AHashMap::new();
let result = sqlx::query_as::<_, OrderPositionIndexRow>(
r#"
SELECT
client_order_id AS "client_order_id",
position_id AS "position_id"
FROM "order_position_index"
"#,View on GitHub (pinned to 18893faf8b)
Solutions
- Inspect the chained sqlx error source for the exact DB message.
- Run schema initialization so `order_position_index` exists with the expected columns.
- Check DB connectivity and pool health.
- If a uniqueness constraint fires, use upsert semantics or delete the stale mapping first.
Example fix
// before
queries::postgres::index_order_position(&pool, &client_order_id, &position_id).await?;
// after
sqlx::query(r#"CREATE TABLE IF NOT EXISTS "order_position_index" (client_order_id VARCHAR PRIMARY KEY, position_id VARCHAR)"#)
.execute(&pool).await?;
queries::postgres::index_order_position(&pool, &client_order_id, &position_id).await?; Defensive patterns
Strategy: validation
Validate before calling
let ready = sqlx::query(r#"SELECT 1 FROM \"order_position_index\" LIMIT 1"#)
.fetch_optional(pool).await.is_ok();
anyhow::ensure!(ready, "order_position_index table missing; run schema init"); Try / catch
match queries::postgres::index_order_position(&pool, &client_order_id, &position_id).await {
Ok(()) => (),
Err(e) => {
tracing::error!(source = ?std::error::Error::source(&e), "order_position_index insert failed");
return Err(e);
}
} Prevention
- Create order_position_index via schema init before any position indexing
- Migrate the schema when upgrading nautilus versions
- Handle unique-constraint conflicts with upsert or delete-then-insert
- Log sqlx source chains for fast diagnosis
When it happens
Trigger: Calling index_order_position when the `order_position_index` table doesn't exist, columns don't match (client_order_id/position_id), a constraint is violated, or the pool connection fails.
Common situations: Cache DB initialized with an older schema lacking the index table; wrong database URL; duplicate/conflicting index rows if unique constraints apply; DB offline during a session.
Related errors
- Failed to insert into bar table: {e}
- Failed to persist execution client {client_id}: {e}
- Failed to insert instrument close: {e}
- Failed to load bars: {e}
- Failed to validate order client origin: {e}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/5634b7bea726a569.
Report an issue: GitHub.