Budibase/budibase · error · Error

No datasource implementation found called: "${integration}"

Error message

No datasource implementation found called: "${integration}"

What it means

getIntegration() resolves a datasource SourceName to its implementation class from the built-in INTEGRATIONS registry. If the name is not registered, it falls back to loading a self-hosted datasource plugin; only when neither path finds a match does it throw 'No datasource implementation found called: "<integration>"'. This means Budibase simply has no connector for that source name in the current deployment.

Source

Thrown at packages/server/src/integrations/index.ts:137

): Promise<IntegrationBaseConstructor> {
  if (INTEGRATIONS[integration]) {
    return INTEGRATIONS[integration]
  }
  if (env.SELF_HOSTED) {
    const plugins = await sdk.plugins.fetch(PluginType.DATASOURCE)
    for (let plugin of plugins) {
      if (plugin.name === integration) {
        // need to use commonJS require due to its dynamic runtime nature
        const retrieved = await getDatasourcePlugin(plugin)
        if (retrieved.integration) {
          return retrieved.integration
        } else {
          return retrieved
        }
      }
    }
  }
  throw new Error(`No datasource implementation found called: "${integration}"`)
}

export default {
  getDefinitions,
  getIntegration,
}

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Check the datasource's source value against SourceName / getDefinitions() output and correct it to a supported name
  2. If it should be a plugin datasource, verify the plugin is installed and that SELF_HOSTED=true so the plugin registry is consulted
  3. Reinstall or fix the failing plugin so it exposes integration (its module must resolve at runtime)
  4. Upgrade/downgrade Budibase so the integration named in the app definition exists; if migrating apps, re-create the datasource with a supported connector

Example fix

// before: referencing a name that is not a registered integration
const integration = await getIntegration("PostgresSQL" as SourceName)
// after: use the exact SourceName value
const integration = await getIntegration(SourceName.POSTGRES)
Defensive patterns

Strategy: validation

Validate before calling

import { getDefinitions, getIntegration, SourceName } from "@budibase/types"
const definitions = await getDefinitions()
if (!definitions[source]) {
  throw new Error(`Unsupported datasource: ${source}`)
}
await getIntegration(source)

Type guard

function isSupportedSource(source: string): source is SourceName {
  return Object.values(SourceName).includes(source as SourceName)
}

Try / catch

try {
  const integration = await getIntegration(source)
  return new integration(config)
} catch (err) {
  if (err.message.startsWith("No datasource implementation found")) {
    throw new Error(`Datasource "${source}" is not installed in this deployment`, { cause: err })
  }
  throw err
}

Prevention

When it happens

Trigger: Passing a SourceName that is not in the INTEGRATIONS map (typo, custom string, removed/renamed integration), or referencing a datasource plugin that is not installed/loaded while running self-hosted (plugins.fetch returns nothing matching), or calling getIntegration on a cloud (non SELF_HOSTED) deployment where plugin fallback is skipped.

Common situations: A datasource document in CouchDB references an integration from an older/newer Budibase version; a custom plugin was uninstalled or failed to load; user data was migrated between environments and carries an unsupported source name; hand-edited or imported app definitions contain an invalid sourceId.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/4256ac9fbf1815b5. Report an issue: GitHub.