> ## Documentation Index
> Fetch the complete documentation index at: https://docs.maia.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# PostgreSQL Unload

export const ComponentMetadata = ({warehouses, unsupportedWarehouses = [], componentType, connectionInputs, connectionOutputs, driverVersion, driverVersionUrl}) => {
  const allWarehouses = [...warehouses.map(w => ({
    name: w,
    supported: true
  })), ...unsupportedWarehouses.map(w => ({
    name: w,
    supported: false
  }))];
  return <div style={{
    background: 'var(--colors-background-light, #f9fafb)',
    border: '1px solid var(--colors-border-default, #e5e7eb)',
    borderRadius: '12px',
    padding: '20px 28px',
    marginBottom: '28px',
    boxShadow: '0 1px 4px rgba(0,0,0,0.10)'
  }}>
      <table style={{
    width: '100%',
    borderCollapse: 'collapse'
  }}>
        <tbody>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle',
    width: '180px'
  }}>Project Availability</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>
              <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '8px'
  }}>
                {allWarehouses.map((w, i) => <span key={i} style={{
    background: w.supported ? '#dcfce7' : '#fee2e2',
    color: w.supported ? '#15803d' : '#b91c1c',
    border: `1px solid ${w.supported ? '#bbf7d0' : '#fca5a5'}`,
    borderRadius: '9999px',
    padding: '3px 12px',
    fontSize: '0.85rem',
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
                    {w.name} {w.supported ? '✅' : '❌'}
                  </span>)}
              </div>
            </td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Component Type</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>{componentType}</td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Connection Inputs</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>{connectionInputs}</td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: driverVersion ? '14px' : '0',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Connection Outputs</td>
            <td style={{
    paddingBottom: driverVersion ? '14px' : '0',
    verticalAlign: 'middle'
  }}>{connectionOutputs}</td>
          </tr>
          {driverVersion && <tr>
              <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Driver Version</td>
              <td style={{
    verticalAlign: 'middle'
  }}>
                {driverVersionUrl ? <a href={driverVersionUrl} target="_blank" rel="noopener noreferrer">{driverVersion}</a> : driverVersion}
              </td>
            </tr>}
        </tbody>
      </table>
    </div>;
};

<ComponentMetadata warehouses={["Snowflake", "Databricks", "Amazon Redshift", "Google BigQuery"]} unsupportedWarehouses={[]} componentType="Connector, Orchestration" connectionInputs="One" connectionOutputs="Unlimited" />

The PostgreSQL Unload orchestration component lets you write data from your data warehouse to a target PostgreSQL database.

If the component requires access to a cloud provider (AWS, Azure, or Google Cloud), it will use credentials as follows:

* If using [Matillion Full SaaS](/docs/guides/runner-overview#matillion-full-saas): The component will use the [cloud credentials](/docs/guides/cloud-credentials) associated with your environment to access resources.
* If using [Hybrid SaaS](/docs/guides/runner-overview#hybrid-saas): By default the component will inherit the agent's execution role (service account role). However, if there are [cloud credentials](/docs/guides/cloud-credentials) associated with your environment, these will overwrite the role.

***

## Properties

Reference material is provided below for the Source and Destination properties.

<ResponseField name="Name" type="string" required>
  A human-readable name for the component.
</ResponseField>

### Source

<Tabs>
  <Tab title="Snowflake">
    <ResponseField name="Database" type="drop-down" required>
      The Snowflake database. The special value `[Environment Default]` uses the database defined in the environment. Read [Databases, Tables and Views - Overview](https://docs.snowflake.com/en/guides-overview-db) to learn more.
    </ResponseField>

    <ResponseField name="Schema" type="drop-down" required>
      The Snowflake schema. The special value `[Environment Default]` uses the schema defined in the environment. Read [Database, Schema, and Share DDL](https://docs.snowflake.com/en/sql-reference/ddl-database.html) to learn more.
    </ResponseField>

    <ResponseField name="Table" type="drop-down" required>
      Select the table to unload to the target PostgreSQL database. The tables available for selection depend on the chosen schema.
    </ResponseField>
  </Tab>

  <Tab title="Databricks">
    <ResponseField name="Catalog" type="drop-down" required>
      Select a [Databricks Unity Catalog](https://docs.databricks.com/en/data-governance/unity-catalog/index.html). The special value `[Environment Default]` uses the catalog defined in the environment. Selecting a catalog will determine which databases are available in the next parameter.
    </ResponseField>

    <ResponseField name="Schema (Database)" type="drop-down" required>
      The Databricks schema. The special value `[Environment Default]` uses the schema defined in the environment. Read [Create and manage schemas](https://docs.databricks.com/en/data-governance/unity-catalog/create-schemas.html) to learn more.
    </ResponseField>

    <ResponseField name="Table" type="drop-down" required>
      Select the table to unload to the target PostgreSQL database. The tables available for selection depend on the chosen schema.
    </ResponseField>
  </Tab>

  <Tab title="Amazon Redshift">
    <ResponseField name="Schema" type="drop-down" required>
      Select the table schema. The special value `[Environment Default]` uses the schema defined in the environment. For more information on using multiple schemas, read [Schemas](https://docs.aws.amazon.com/redshift/latest/dg/r_Schemas_and_tables.html).
    </ResponseField>

    <ResponseField name="Table" type="drop-down" required>
      Select the table to unload to the target PostgreSQL database. The tables available for selection depend on the chosen schema.
    </ResponseField>
  </Tab>

  <Tab title="Google BigQuery">
    <ResponseField name="GCP Project ID" type="drop-down" required>
      The Google Cloud project that owns the BigQuery dataset. The special value `[Environment Default]` uses the Google Cloud project defined in the environment. For more information, read [Creating projects](https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects).
    </ResponseField>

    <ResponseField name="Dataset" type="drop-down" required>
      The Google BigQuery dataset containing the table to query. The special value `[Environment Default]` uses the dataset defined in the environment.
    </ResponseField>

    <ResponseField name="Table" type="drop-down" required>
      Select the table to unload to the target PostgreSQL database. The tables available for selection depend on the chosen dataset.
    </ResponseField>
  </Tab>
</Tabs>

<ResponseField name="Columns" type="object selector">
  Select columns to return from the table.

  Leave this blank to unload all columns.
</ResponseField>

<ResponseField name="Primary Keys" type="object selector">
  Select one or more columns to use as the table's primary key. The component uses the primary key to identify matching rows in the target table when determining the update strategy.

  If you select multiple columns, the component creates a composite primary key using the combination of the selected columns.

  Leave this blank to load all rows without duplicate checking.
</ResponseField>

<ResponseField name="Limit" type="integer">
  Set a numeric value to limit the number of rows that are unloaded. The default is an empty field, which unloads all rows.
</ResponseField>

<ResponseField name="Filter Conditions" type="column editor">
  Define one or more filter conditions that each row of data must meet to be unloaded.

  * **Input Column:** Select an input column. The available input columns vary depending upon the selected table.
  * **Qualifier:**
    * **Is:** Compares the column to the value using the comparator.
    * **Not:** Reverses the effect of the comparison, so "Equals" becomes "Not equals", "Less than" becomes "Greater than or equal to", etc.
  * **Comparator:** Choose a method of comparing the column to the value. Possible comparators include: "Equal to", "Greater than", "Less than", "Greater than or equal to", "Less than or equal to", "Like", "Null". Not all column types support all comparators.
  * **Value:** The value to be compared.

  Click the **Text Mode** toggle at the bottom of the **Filter Conditions** dialog to open a multi-line editor that lets you add items in a single block. For more information, read [Text mode](/docs/guides/components-overview#component-properties).
</ResponseField>

<ResponseField name="Combine Condition" type="drop-down">
  The filter conditions you have defined can be combined using either **And** or **Or** logic. If **And**, then all filter conditions must be satisfied to unload the data row. If **Or**, then only a single filter condition must be satisfied. The default is **And**.

  If you have only one filter condition, or no filter conditions, this parameter is essentially ignored.
</ResponseField>

### Destination

<ResponseField name="Connection" type="drop-down" required>
  Select a [Connection](/docs/guides/connections). This connection defines all credentials needed to connect to the service.

  If the required connection doesn't yet exist, you can create it here by selecting **Add Connection** in the drop-down. Read [Add a connection](/docs/guides/connections#add-a-connection) for further details, following that process from step 4 onwards. A connection created here is visible in the **Connections** tab and available for other connectors to use.
</ResponseField>

<ResponseField name="Schema" type="string" required>
  The name of the PostgreSQL schema to write the target table into.
</ResponseField>

<ResponseField name="Table" type="string" required>
  The name of the table to create or write to in the target PostgreSQL database.
</ResponseField>

<ResponseField name="Write Mode" type="drop-down" required>
  Define what happens when the component writes to the target table.

  * **Replace:** If the specified table already exists, it will be dropped and recreated with the new data. If the table doesn't exist, a new table is created.
  * **Truncate and insert:** If the specified table already exists, all existing rows are removed before new rows are inserted. If the table doesn't exist, a new table is created.
  * **Append:** New rows are added to the existing table. If the table doesn't exist, a new table is created. When **Primary Keys** are specified, the **Update Strategy** property determines how duplicate rows are handled.
</ResponseField>

<ResponseField name="Update Strategy" type="drop-down" required>
  When **Write Mode** is set to **Append** and **Primary Keys** have been specified, this property determines how existing rows with matching primary key values are handled.

  * **Ignore:** Rows in the destination with the same primary key values as incoming rows are kept unchanged. This is the default behavior.
  * **Replace:** Rows in the destination with the same primary key values as incoming rows are replaced with the incoming data.
</ResponseField>

<ResponseField name="Connection Options" type="column editor">
  * **Parameter:** A JDBC parameter supported by the database driver. The available parameters are explained in the data model. Manual setup is not usually required, since sensible defaults are assumed.
  * **Value:** A value for the given parameter.

  Toggle **Text mode** on at the bottom of the dialog to open a multi-line editor that lets you add items in a single block. For more information, read [Text mode](/docs/guides/components-overview#text-mode).
</ResponseField>
