Budibase/budibase · error · Error
Datasource is not configured fully.
Error message
Datasource is not configured fully.
What it means
getExternalTablesInDatasource loads the datasource document with enriched entities (tables extracted by the connector). If the datasource doesn't exist or its entities were never fetched/attached, the datasource is unusable for table operations, so it throws.
Source
Thrown at packages/server/src/sdk/workspace/tables/getters.ts:272
const [internal, external] = await Promise.all([
getAllInternalTables(),
getAllExternalTables(),
])
span.addTags({
numInternalTables: internal.length,
numExternalTables: external.length,
})
return await processTables([...internal, ...external])
})
}
export async function getExternalTablesInDatasource(
datasourceId: string
): Promise<Record<string, Table>> {
return await tracer.trace("getExternalTablesInDatasource", async span => {
const datasource = await datasources.get(datasourceId, { enriched: true })
if (!datasource || !datasource.entities) {
throw new Error("Datasource is not configured fully.")
}
span.addTags({
datasourceId,
numEntities: Object.keys(datasource.entities).length,
})
return await processEntities(datasource.entities)
})
}
export async function getTables(tableIds: string[]): Promise<Table[]> {
return tracer.trace("getTables", async span => {
span.addTags({ numTableIds: tableIds.length })
const externalTableIds = tableIds.filter(tableId =>
isExternalTableID(tableId)
),
internalTableIds = tableIds.filter(tableId => !isExternalTableID(tableId))
let tables: Table[] = []
if (externalTableIds.length) {View on GitHub (pinned to a81a902e9a)
Solutions
- Verify the datasourceId is valid and the datasource document exists
- Complete the datasource connection flow so entities are fetched and attached
- Check datasource credentials/connectivity and re-sync
- Delete and recreate the datasource if its configuration is corrupt
Example fix
// before
await tables.external.getExternalTablesInDatasource(unsyncedDsId)
// after
const ds = await datasources.get(unsyncedDsId)
if (!ds?.entities) {
await datasources.update({ ...ds, entities: await fetchEntities(ds) })
}
await tables.external.getExternalTablesInDatasource(unsyncedDsId) Defensive patterns
Strategy: validation
Validate before calling
const ds = await datasources.get(datasourceId, { enriched: true })
if (!ds || !ds.entities) throw new Error("Datasource missing or not synced") Type guard
function isConfigured(ds: Datasource | undefined): ds is Datasource & { entities: Record<string, Table> } {
return !!ds && !!ds.entities
} Try / catch
try {
const entities = await tables.external.getExternalTablesInDatasource(datasourceId)
} catch (err) {
if (err.message === "Datasource is not configured fully.") {
// re-fetch/sync the datasource or recreate it
}
} Prevention
- Complete the datasource connect/fetch flow before reading tables
- Verify credentials and connectivity for the SQL source
- Guard against using datasource IDs from deleted documents
When it happens
Trigger: Calling getExternalTablesInDatasource (directly or via getExternalTable) with a datasourceId whose document is missing, deleted, or has no entities — e.g. a datasource created but never fetched/synced, or an app whose datasource config failed.
Common situations: Connecting a datasource without completing the fetch/sync step; datasource deleted while app pages still reference it; invalid credentials preventing entity extraction; environment misconfiguration for the SQL connection.
Related errors
- No google configuration found
- Configuration invalid. Must contain google clientID and clie
- App not found with id "${workspaceApp._id}"
- Failed to refresh saved group
- No recaptcha config found
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/4c0ce118c3371d46.
Report an issue: GitHub.