dbt-labs/dbt-core · error · minijinja::Error::SerdeDeserializeError

adapter.parse_partition_by failed on {raw_partition_by:?}: {

Error message

adapter.parse_partition_by failed on {raw_partition_by:?}: {e}

What it means

parse_partition_by normalizes and deserializes a raw partition_by config value into PartitionConfig via serde. If the value (string like "DATE(x)", dict, or other shape) cannot be parsed into PartitionConfig, it is rethrown as a SerdeDeserializeError including the raw input and underlying message. It exists to validate BigQuery partition configs before use.

Source

Thrown at crates/dbt-adapter/src/adapter/adapter_impl.rs:3865

                    let new_map: IndexMap<String, Value> = partition_by_map
                        .into_iter()
                        .map(|(key, value)| {
                            let normalized_value = if let Some(s) = value.as_str() {
                                Value::from(s.to_lowercase())
                            } else {
                                value
                            };
                            (key, normalized_value)
                        })
                        .collect();
                    Value::from_serialize(&new_map)
                } else {
                    raw_partition_by.clone()
                };

                let partition_by = minijinja_value_to_typed_struct::<PartitionConfig>(normalized)
                    .map_err(|e| {
                    minijinja::Error::new(
                        minijinja::ErrorKind::SerdeDeserializeError,
                        format!("adapter.parse_partition_by failed on {raw_partition_by:?}: {e}"),
                    )
                })?;

                let validated_config = partition_by.into_bigquery().ok_or_else(|| {
                    minijinja::Error::new(
                        minijinja::ErrorKind::InvalidArgument,
                        "Expect a BigqueryPartitionConfigStruct",
                    )
                })?;

                Ok(Value::from_object(validated_config))
            }
            Postgres | Snowflake | Databricks | Redshift | Salesforce | Spark | DuckDB
            | LakeCompute | Fabric | ClickHouse | Exasol | Starburst | Athena | Trino
            | Datafusion | Dremio | Oracle => {
                unimplemented!("only available with BigQuery adapter")

View on GitHub (pinned to 0267ce9170)

Solutions

  1. Check the error message's raw_partition_by dump and the serde message; fix the offending key/type in your model config.
  2. Use documented shapes: {"field": "...", "data_type": ..., "granularity": ...} or a range/time configuration.
  3. If using a range partition, ensure 'range' contains start/end/interval integers.
  4. Test the config with a minimal model before re-running the full pipeline.

Example fix

// before (invalid key)
{{ config(partition_by={"column": "event_date", "granularity": "day"}) }}

// after
{{ config(partition_by={"field": "event_date", "data_type": "date", "granularity": "day"}) }}
Defensive patterns

Strategy: validation

Validate before calling

def valid_partition_by(p):
    if isinstance(p, str):
        return True  # expression form, e.g. DATE(col) or range config string
    if isinstance(p, dict):
        return 'field' in p and isinstance(p['field'], str)
    return False
if not valid_partition_by(config.get('partition_by')):
    raise ValueError('partition_by must be a string or a dict with a string field key')

Type guard

def as_partition_config(p):
    if isinstance(p, str):
        return {'raw': p}
    if isinstance(p, dict) and 'field' in p:
        return p
    return None

Try / catch

try:
    parsed = adapter.parse_partition_by(raw_partition_by)
except Exception as e:
    raise ValueError(f'partition_by config invalid: {raw_partition_by!r}: {e}') from e

Prevention

When it happens

Trigger: Config {"partition_by": ...} with a malformed value: invalid dict keys, bad structure (e.g. missing 'field'), or a string that normalization cannot turn into a valid PartitionConfig.

Common situations: Typo in partition_by config keys (e.g. 'columns' instead of 'field'); granularity/range misspelled or wrong-typed; passing a non-string non-dict value; BigQuery-specific configs used without the required structure.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07). Data as JSON: /api/errors/78399380514bb131. Report an issue: GitHub.