Resources are used in Dagster to make external resources (like a database connection) available to solids during pipeline execution. When used alongside modes, resources make it easier to write pipelines that can be developed locally and tested.
Name | Description |
---|---|
@resource | The decorator used to define resources. The decorated function is called a resource_fn . The decorator returns a ResourceDefinition |
ResourceDefinition | Base class for solids. You almost never want to use initialize this class directly. Instead, you should use the @resource which returns a ResourceDefinition |
We recommend learning about Modes before learning about resources.
Resources ...
To define a resource, we use the @resource
decorator:
class DatabaseConnection():
def execute_query():
pass
@resource
def db_resource(init_context):
return DatabaseConnection()
The @resource
decorator decorates a function that returns a resource. The object returned from the resource function itself can be any standard python object - it doesn't need to inherit any particular interface or implement any particular functionality.
ResourceDefinitions
can have a config schema, which allows you to customize behavior at runtime through pipeline configuration.For example, let's say we wanted to pass a connection string to our DatabaseConnection
resource.
class DatabaseConnection():
def __init__(connection: str):
self.connection = connection
@resource(config_schema={"connection": str})
def db_resource(init_context):
connection = init_context.resource_config["connection"]
return DatabaseConnection(connection)
Resources can depend upon other resources. If a resource key is included in the required_resource_keys
set provided to the resource definition, then the resource initializer can access a required resource via the "resources" attribute of its context object.