Zackriya-Solutions/meetily · error · anyhow::Error
Failed to query transcript config: {}
Error message
Failed to query transcript config: {} What it means
The query SELECT provider, model FROM transcript_settings WHERE id = '1' itself errored. A missing row is NOT this error - the None arm handles that by defaulting the model; this error means the query execution failed: no transcript_settings table (schema/migration missing), the database is locked, or the file is corrupt.
Source
Thrown at frontend/src-tauri/src/audio/retranscription.rs:600
let app_state = app
.try_state::<AppState>()
.ok_or_else(|| {
error!("App state not available");
anyhow!("App state not available")
})?;
debug!("Querying transcript_settings table...");
// Query the transcript settings from the database - get both provider and model
let result: Option<(String, String)> = sqlx::query_as(
"SELECT provider, model FROM transcript_settings WHERE id = '1'"
)
.fetch_optional(app_state.db_manager.pool())
.await
.map_err(|e| {
error!("Failed to query transcript config: {}", e);
anyhow!("Failed to query transcript config: {}", e)
})?;
match result {
Some((provider, model)) => {
info!("Found transcript config: provider={}, model={}", provider, model);
// Check if provider is Whisper-based
if provider == "localWhisper" || provider == "whisper" {
Ok(model)
} else {
error!("Retranscription requires Whisper provider, but configured provider is: {}", provider);
Err(anyhow!("Retranscription requires Whisper. Current provider '{}' does not support retranscription with language selection.", provider))
}
},
None => {
// Default to configured Whisper model if no config exists
warn!("No transcript config found, using default model '{}'", DEFAULT_WHISPER_MODEL);
Ok(DEFAULT_WHISPER_MODEL.to_string())View on GitHub (pinned to 0281737d87)
Solutions
- Read the inner error: 'no such table: transcript_settings' means run the schema/migrations.
- Pass an explicit model argument to start_retranscription - the config lookup is bypassed completely.
- Retry when the database is not being written by another operation.
- Recreate or restore the database if integrity checks fail.
Defensive patterns
Strategy: validation
Validate before calling
// Check the settings table exists and is readable before the batch job
let exists: i64 = sqlx::query_scalar(
"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='transcript_settings'"
).fetch_one(pool).await.unwrap_or(0);
if exists == 0 { /* run migrations or pass explicit model */ } Try / catch
// Distinguish missing schema (fix) from lock (retry)
Err(e) if e.to_string().contains("no such table") => fix_schema(),
Err(e) if is_busy(&e) => retry_later(),
Err(e) => propagate(e), Prevention
- Run migrations at startup so transcript_settings always exists.
- Pass an explicit model argument to avoid depending on the settings row.
- Avoid concurrent settings writes while retranscription resolves its model.
When it happens
Trigger: Database created without running migrations that create transcript_settings; another writer holds the SQLite lock at query time; corrupted DB file.
Common situations: App data directory from an older app version; first-run migration interrupted; a second app instance writing settings concurrently.
Related errors
- Failed to delete existing transcripts: {}
- DB error: {}
- Failed to start transaction: {}
- Failed to create meeting: {}
- Failed to insert transcript: {}
AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16).
Data as JSON: /api/errors/54c29e6660874742.
Report an issue: GitHub.