---
page_title: 'Attribute default values: Migrating from SDKv2 to the Framework'
description: >-
  Specify a default when the Terraform configuration does not supply a value for resource attributes.
  Migrate attribute defaults in SDKv2 to AttributePlanModifier in the Framework.
---

# Default Values

Default values support is only available in the Framework for resources. Handle default values for data source attributes within the [data source `Read` method](/terraform/plugin/framework/data-sources#read-method) and default values for provider attributes within the [provider `Configure` method](/terraform/plugin/framework/providers#configure-method).

Default values set a value for an attribute when the Terraform configuration does not provide one. In SDKv2 and the
Framework default values are set via the `Default` field on an attribute's schema.
Refer to
[Default](/terraform/plugin/framework/resources/default)
in the Framework documentation for details.

This page explains how to migrate attribute defaults in SDKv2 to the Framework.

## SDKv2

In SDKv2, default values are defined for a primitive attribute type (i.e., `TypeBool`, `TypeFloat`, `TypeInt`,
`TypeString`) by the `Default` field on the attribute's schema. Alternatively, the `DefaultFunc` function is used to
compute a default value for an attribute.

The following code shows a basic implementation of a default value for a primitive attribute type in SDKv2.

```go
func resourceExample() *schema.Resource {
    return &schema.Resource{
         /* ... */
        Schema: map[string]*schema.Schema{
            "attribute_example": {
                Default:     2048,
                /* ... */
            },
        /* ... */
```

## Framework

In the Framework, you set default values with the `Default` field on your attribute's definition.

```go
import (
  "context"

  "github.com/hashicorp/terraform-plugin-framework/resource"
  "github.com/hashicorp/terraform-plugin-framework/resource/schema"
  "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault"
)

func (r *resourceExample) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
    resp.Schema = schema.Schema{
        /* ... */
        Attributes: map[string]schema.Attribute{
            "attribute_example": schema.BoolAttribute{
                Default: booldefault.StaticBool(true),
                /* ... */
```

## Migration Notes

Remember the following differences between SDKv2 and the Framework when completing the migration.

- In SDKv2, default values are set with the `Default` or `DefaultFunc` fields on an attribute's `schema.Schema` struct.
In the Framework, you must assign set the `Default` field on an attribute to set a default value.

## Example

### SDKv2

The following example shows the implementation of the `Default` field for the
`example_attribute` attribute on the `exampleResource` resource with SDKv2.

```go
func exampleResource() *schema.Resource {
    return &schema.Resource{
        Schema: map[string]*schema.Schema{
            "example_attribute": {
                Default:     2048,
                /* ... */
            },
            /* ... */
```

### Framework

The following shows the same section of code after the migration.

This code implements the `PlanModifiers` field for the `example_attribute` attribute with the Framework.

```go
func (r *exampleResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
    resp.Schema = schema.Schema{
        Attributes: map[string]schema.Attribute{
            "example_attribute": schema.Int64Attribute{
                Default: int64default.StaticInt64(2048)
                /* ... */
            },
            /* ... */
        },
    }, nil
}
```
