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
- Check the error message's raw_partition_by dump and the serde message; fix the offending key/type in your model config.
- Use documented shapes: {"field": "...", "data_type": ..., "granularity": ...} or a range/time configuration.
- If using a range partition, ensure 'range' contains start/end/interval integers.
- 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
- Use the documented keys: field, data_type, granularity, range
- Never rename 'field' to 'column' or 'columns'
- Keep range values as integers (start, end, interval)
- Run a single-model dbt parse/compile to catch config typos early
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
- when data_type is date, inner must be a TimeConfig
- time_partitioning_field must be a string
- Expect a BigqueryPartitionConfigStruct
- get_table_options: Failed to deserialize config: {e}
- adapter.add_time_ingestion_partition_column failed on partit
AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07).
Data as JSON: /api/errors/78399380514bb131.
Report an issue: GitHub.