apache/beam · error · ValueError

Unsupported database adapter type

Error message

Unsupported database adapter type: {self.name}

What it means

DatabaseTypeAdapter.to_sqlalchemy_dialect maps the adapter enum (POSTGRESQL, MYSQL, SQLSERVER) to a sqlalchemy dialect prefix; an unrecognized enum member falls through and raises ValueError. This happens only if a new enum value was added without a corresponding dialect mapping.

Solutions

  1. Use one of the supported values: POSTGRESQL, MYSQL, or SQLSERVER
  2. Add the new member to to_sqlalchemy_dialect's mapping if you control the code
  3. Check installed apache-beam version for enum compatibility with your config

Example fix

// before
DB_TYPE = DatabaseTypeAdapter.ORACLE  # unmapped member
// after
DB_TYPE = DatabaseTypeAdapter.POSTGRESQL  # supported adapter
Defensive patterns

Strategy: validation

Validate before calling

supported = {DatabaseTypeAdapter.POSTGRESQL, DatabaseTypeAdapter.MYSQL, DatabaseTypeAdapter.SQLSERVER}
if adapter not in supported:
    raise ValueError(f'{adapter} not supported; use one of {supported}')

Try / catch

try:
    dialect = adapter.to_sqlalchemy_dialect()
except ValueError as e:
    log.error('falling back to postgresql: %s', e)
    dialect = DatabaseTypeAdapter.POSTGRESQL.to_sqlalchemy_dialect()

Prevention

When it happens

Trigger: Calling to_sqlalchemy_dialect (directly or via start_sql_db_container) on a DatabaseTypeAdapter member not covered by the if/elif chain.

Common situations: Extending the enum with a new adapter (e.g. Oracle) in a fork or newer Beam version without updating the mapping; monkeypatching/constructing a fake enum member in tests.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/449473a54ce5730a. Report an issue: GitHub.

Appendix: source

Thrown at sdks/python/apache_beam/transforms/enrichment_handlers/cloudsql.py:110

class DatabaseTypeAdapter(Enum):
  POSTGRESQL = "pg8000"
  MYSQL = "pymysql"
  SQLSERVER = "pytds"

  def to_sqlalchemy_dialect(self):
    """Map the adapter type to its corresponding SQLAlchemy dialect.

    Returns:
        str: SQLAlchemy dialect string.
    """
    if self == DatabaseTypeAdapter.POSTGRESQL:
      return f"postgresql+{self.value}"
    elif self == DatabaseTypeAdapter.MYSQL:
      return f"mysql+{self.value}"
    elif self == DatabaseTypeAdapter.SQLSERVER:
      return f"mssql+{self.value}"
    else:
      raise ValueError(f"Unsupported database adapter type: {self.name}")


class ConnectionConfig(ABC):
  @abstractmethod
  def get_connector_handler(self) -> Callable[[], DBAPIConnection]:
    pass

  @abstractmethod
  def get_db_url(self) -> str:
    pass


@dataclass
class CloudSQLConnectionConfig(ConnectionConfig):
  """Connects to Google Cloud SQL using Cloud SQL Python Connector.

    Args:
        db_adapter: The database adapter type (PostgreSQL, MySQL, SQL Server).

View on GitHub (pinned to 12126d8942)