nautechsystems/nautilus_trader · error

Failed to insert into order_position_index table

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.

Solutions

  1. Inspect the chained sqlx error source for the exact DB message.
  2. Run schema initialization so `order_position_index` exists with the expected columns.
  3. Check DB connectivity and pool health.
  4. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/5634b7bea726a569. Report an issue: GitHub.

Appendix: 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)