clockworklabs/SpacetimeDB · error · anyhow::Error

Multiple databases found in config: {}. Please specify which

Error message

Multiple databases found in config: {}. Please specify which database to query:\n  spacetime sql <database> \"{}\"

What it means

From `spacetime sql` argument resolution: you passed a single argument that contains a space (almost certainly the SQL query, so no positional database can be inferred), and the project/config exposes more than one database target, so the CLI cannot pick a default. It lists the known databases and echoes your query back in the suggested command.

Source

Thrown at crates/cli/src/subcommands/sql.rs:265

            "query",
            "spacetime sql [database] <query> [--no-config]",
        )
        .or_else(|e| {
            // `sql` expects exactly 1 query arg, so if we have 2+ positional args the first
            // must be a database name. If it didn't match any config target, treat it as an
            // ad-hoc database outside the project (auto-fallthrough).
            if raw_parts.len() >= 2 {
                Ok(ResolvedDbArgs {
                    database: raw_parts[0].clone(),
                    server: None,
                    remaining_args: raw_parts[1..].to_vec(),
                })
            } else if raw_parts.len() == 1 && raw_parts[0].contains(' ') {
                // The single arg contains spaces, so it's almost certainly a SQL query,
                // not a database name. Give a clearer error than "missing <query>".
                let targets = config_targets.as_deref().unwrap_or_default();
                let known: Vec<&str> = targets.iter().map(|t| t.database.as_str()).collect();
                Err(anyhow::anyhow!(
                    "Multiple databases found in config: {}. Please specify which database to query:\n  \
                     spacetime sql <database> \"{}\"",
                    known.join(", "),
                    raw_parts[0]
                ))
            } else {
                Err(e)
            }
        })?;
        let query = resolved.remaining_args.join(" ");
        let confirmed = args.get_one::<bool>("confirmed").copied();

        let con = parse_req(config, args, &resolved.database, resolved.server.as_deref()).await?;
        let mut api = ClientApi::new(con).sql();
        if let Some(confirmed) = confirmed {
            api = api.query(&[("confirmed", if confirmed { "true" } else { "false" })]);
        }

View on GitHub (pinned to 6dee26c6ef)

Solutions

  1. Name the database explicitly: `spacetime sql <database> "SELECT ..."` exactly as printed in the error
  2. Reduce the project config to a single default database if one is canonical
  3. In scripts, always pass <database> positionally instead of relying on auto-detection

Example fix

# before
spacetime sql "SELECT * FROM player"

# after
spacetime sql my_game "SELECT * FROM player"
Defensive patterns

Strategy: validation

Validate before calling

# bash: always pass the database positionally in scripts
DB="${SPACETIME_DB:?set SPACETIME_DB to the target database}"
spacetime sql "$DB" "SELECT * FROM player"

Prevention

When it happens

Trigger: `spacetime sql "SELECT * FROM t"` (query only, no database) while the detected project config declares multiple database targets; any one-argument invocation whose argument contains a space when config_targets has 2+ entries.

Common situations: Monorepos/workspaces with several databases in one project; switching between databases in the same checkout; CI scripts written when only one database existed and later a second was added.

Related errors


AI-assisted analysis of clockworklabs/SpacetimeDB@6dee26c6ef (2026-08-20). Data as JSON: /api/errors/35c2a0d476cea053. Report an issue: GitHub.