dbt-teradata


Namedbt-teradata JSON
Version 1.7.2 PyPI version JSON
download
home_pagehttps://github.com/Teradata/dbt-teradata
SummaryThe Teradata adapter plugin for dbt (data build tool)
upload_time2024-04-02 12:15:43
maintainerNone
docs_urlNone
authorTeradata Corporation
requires_python<3.12,>=3.8
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # dbt-teradata

The dbt Teradata adapter lets you use [dbt](https://getdbt.com) with Teradata Vantage.

**_NOTE:_** This adapter is maintained by Teradata. We are accelerating our release cadence. Starting October 1st, 2023, we will release `dbt-teradata` within 4 weeks of a minor release or within 8 weeks of a major release of `dbt-core`.

## Installation

```
pip install dbt-teradata
```

If you are new to dbt on Teradata see [dbt with Teradata Vantage tutorial](https://quickstarts.teradata.com/dbt.html).

**_NOTE:_** If the virtual environment in Python is not activating properly on Windows, you can try running the below command in the command-line interface (CLI) before attempting to activate the virtual environment.

```
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUse
```

## Sample profile

Here is a working example of a `dbt-teradata` profile:

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: localhost
      user: dbc
      password: dbc
      schema: dbt_test
      tmode: ANSI
```

At a minimum, you need to specify `host`, `user`, `password`, `schema` (database), `tmode`.

## Python compatibility

| Plugin version | Python 3.6  | Python 3.7  | Python 3.8  | Python 3.9  | Python 3.10 | Python 3.11  |
| -------------- | ----------- | ----------- | ----------- | ----------- | ----------- | ------------ |
| 0.19.0.x           | ✅          | ✅          | ✅          | ❌          | ❌          | ❌
| 0.20.0.x           | ✅          | ✅          | ✅          | ✅          | ❌          | ❌
| 0.21.1.x           | ✅          | ✅          | ✅          | ✅          | ❌          | ❌
| 1.0.0.x           | ❌           | ✅          | ✅          | ✅          | ❌          | ❌
|1.1.x.x            | ❌           | ✅          | ✅          | ✅          | ✅          | ❌
|1.2.x.x            | ❌           | ✅          | ✅          | ✅          | ✅          | ❌
|1.3.x.x            | ❌           | ✅          | ✅          | ✅          | ✅          | ❌
|1.4.x.x            | ❌           | ✅          | ✅          | ✅          | ✅          | ✅
|1.5.x              | ❌           | ✅          | ✅          | ✅          | ✅          | ✅
|1.6.x              | ❌           | ❌          | ✅          | ✅          | ✅          | ✅
|1.7.x              | ❌           | ❌          | ✅          | ✅          | ✅          | ✅


##  dbt dependent packages version compatibility
| dbt-teradata | dbt-core | dbt-teradata-util |  dbt-util      |
|--------------|----------|-------------------|----------------|
| 1.2.x        | 1.2.x    | 0.1.0             | 0.9.x or below |
| 1.6.7        | 1.6.7    | 1.1.1             | 1.1.1          |
| 1.7.x        | 1.7.x    | 1.1.1             | 1.1.1          |

## Optional profile configurations

### Logmech

The logon mechanism for Teradata jobs that dbt executes can be configured with the `logmech` configuration in your Teradata profile. The `logmech` field can be set to: `TD2`, `LDAP`, `KRB5`, `TDNEGO`. For more information on authentication options, go to [Teradata Vantage authentication documentation](https://docs.teradata.com/r/8Mw0Cvnkhv1mk1LEFcFLpw/0Ev5SyB6_7ZVHywTP7rHkQ).

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      user: <user>
      password: <password>
      schema: dbt_test
      tmode: ANSI
      logmech: LDAP
```

### Logdata

The logon mechanism for Teradata jobs that dbt executes can be configured with the `logdata` configuration in your Teradata profile. Addtional data like secure token, distinguished Name, or a domain/realm name can be set in your Teradata profile using `logdata`. The `logdata` field can be set to: `JWT`, `LDAP`, `KRB5`, `TDNEGO`. `logdata` is not used with the TD2 mechanism. 

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      schema: dbt_test
      tmode: ANSI
      logmech: LDAP
      logdata: 'authcid=username password=password'
      port: <port>
```

For more information on authentication options, go to [Teradata Vantage authentication documentation](https://docs.teradata.com/r/8Mw0Cvnkhv1mk1LEFcFLpw/0Ev5SyB6_7ZVHywTP7rHkQ)

### Stored Password Protection

Stored Password Protection enables an application to provide a connection password in encrypted form to the driver. The plugin supports Stored Password Protection feature through prefix `ENCRYPTED_PASSWORD(` either in `password` connection parameter  or in `logdata` connection parameter.

* `password`

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      user: <user>
      password: ENCRYPTED_PASSWORD(file:PasswordEncryptionKeyFileName,file:EncryptedPasswordFileName)
      schema: dbt_test
      tmode: ANSI
      port: <port>
```
* `logdata`

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      schema: dbt_test
      tmode: ANSI
      logmech: LDAP
      logdata: 'authcid=username password=ENCRYPTED_PASSWORD(file:PasswordEncryptionKeyFileName,file:EncryptedPasswordFileName)'
      port: <port>
```

For full description of Stored Password Protection see https://github.com/Teradata/python-driver#StoredPasswordProtection.


### Port

If your Teradata database runs on port different than the default (1025), you can specify a custom port in your dbt profile using `port` configuration.

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      user: <user>
      password: <password>
      schema: dbt_test
      tmode: ANSI
      port: <port>
```

### Retries

Allows an adapter to automatically try again when the attempt to open a new connection on the database has a transient, infrequent error. This option can be set using the `retries` configuration. Default value is 0. The default wait period between connection attempts is one second. `retry_timeout` (seconds) option allows us to adjust this waiting period.

If `retries` is set to 3, the adapter will try to establish a new connection three times if an error occurs.

```yaml
my-teradata-db-profile:
  target: dev
  outputs:
    dev:
      type: teradata
      host: <host>
      user: <user>
      password: <password>
      schema: dbt_test
      tmode: ANSI
      retries: 3
      retry_timeout: 10
```

### Other Teradata connection parameters

The plugin also supports the following Teradata connection parameters:
* account
* column_name
* cop
* coplast
* encryptdata
* fake_result_sets
* field_quote
* field_sep
* lob_support
* log
* logdata
* max_message_body
* partition
* sip_support
* teradata_values
* sslmode
* sslca
* sslcapath
* sslcrc
* sslcipher
* sslprotocol
* browser
* browser_tab_timeout
* browser_timeout
* sp_spl
* sessions
* runstartup
* logon_timeout
* https_port
* connect_timeout
* request_timeout

For full description of the connection parameters see https://github.com/Teradata/python-driver#connection-parameters.

## Supported Features

### Materializations

* `view`
* `table`
* `ephemeral`
* `incremental`

#### Incremental Materialization
The following incremental materialization strategies are supported:
* `append` (default)
* `delete+insert`
* `merge`

To learn more about dbt incremental strategies please check [the dbt incremental strategy documentation](https://docs.getdbt.com/docs/build/incremental-models#about-incremental_strategy).

### Commands

All dbt commands are supported.

### Custom configurations

#### General

* *Enable view column types in docs* -  Teradata Vantage has a dbscontrol configuration flag called `DisableQVCI` (QVCI - Queryable View Column Index). This flag instructs the database to build `DBC.ColumnsJQV` with view column type definitions. 

    > :information_source: Existing customers, please see [KB0022230](https://support.teradata.com/knowledge?id=kb_article_view&sys_kb_id=d066248b1b0000187361c8415b4bcb48) for more information about enabling QVCI.

  To enable this functionality you need to:
  1. Enable QVCI mode in Vantage. Use `dbscontrol` utility and then restart Teradata. Run these commands as a privileged user on a Teradata node:
      ```bash
      # option 551 is DisableQVCI. Setting it to false enables QVCI.
      dbscontrol << EOF
      M internal 551=false
      W
      EOF

      # restart Teradata
      tpareset -y Enable QVCI
      ```
  2. Instruct `dbt` to use `QVCI` mode. Include the following variable in your `dbt_project.yml`:
      ```yaml
      vars:
        use_qvci: true
      ```
      For example configuration, see `test/catalog/with_qvci/dbt_project.yml`.

#### Models

##### Table

The following options apply to table, snapshots and seed materializations.

* `table_kind` - define the table kind. Legal values are `MULTISET` (default for ANSI transaction mode required by `dbt-teradata`) and `SET`, e.g.:
    * in sql materialization definition file:
      ```yaml
      {{
        config(
            materialized="table",
            table_kind="SET"
        )
      }}
      ```
    * in seed configuration:
      ```yaml
      seeds:
        <project-name>:
          table_kind: "SET"
      ```
  For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).
* `table_option` - define table options. Legal values are:
    ```ebnf
    { MAP = map_name [COLOCATE USING colocation_name] |
      [NO] FALLBACK [PROTECTION] |
      WITH JOURNAL TABLE = table_specification |
      [NO] LOG |
      [ NO | DUAL ] [BEFORE] JOURNAL |
      [ NO | DUAL | LOCAL | NOT LOCAL ] AFTER JOURNAL |
      CHECKSUM = { DEFAULT | ON | OFF } |
      FREESPACE = integer [PERCENT] |
      mergeblockratio |
      datablocksize |
      blockcompression |
      isolated_loading
    }
    ```
    where:
    * mergeblockratio:
      ```ebnf
      { DEFAULT MERGEBLOCKRATIO |
        MERGEBLOCKRATIO = integer [PERCENT] |
        NO MERGEBLOCKRATIO
      }
      ```
    * datablocksize:
      ```ebnf
      DATABLOCKSIZE = {
        data_block_size [ BYTES | KBYTES | KILOBYTES ] |
        { MINIMUM | MAXIMUM | DEFAULT } DATABLOCKSIZE
      }
      ```
    * blockcompression:
      ```ebnf
      BLOCKCOMPRESSION = { AUTOTEMP | MANUAL | ALWAYS | NEVER | DEFAULT }
        [, BLOCKCOMPRESSIONALGORITHM = { ZLIB | ELZS_H | DEFAULT } ]
        [, BLOCKCOMPRESSIONLEVEL = { value | DEFAULT } ]
      ```
    * isolated_loading:
      ```ebnf
      WITH [NO] [CONCURRENT] ISOLATED LOADING [ FOR { ALL | INSERT | NONE } ]
      ```

    Examples:
    * in sql materialization definition file:
      ```yaml
      {{
        config(
            materialized="table",
            table_option="NO FALLBACK"
        )
      }}
      ```
      ```yaml
      {{
        config(
            materialized="table",
            table_option="NO FALLBACK, NO JOURNAL"
        )
      }}
      ```
      ```yaml
      {{
        config(
            materialized="table",
            table_option="NO FALLBACK, NO JOURNAL, CHECKSUM = ON,
              NO MERGEBLOCKRATIO,
              WITH CONCURRENT ISOLATED LOADING FOR ALL"
        )
      }}
      ```
    * in seed configuration:
      ```yaml
      seeds:
        <project-name>:
          table_option:"NO FALLBACK"
      ```
      ```yaml
      seeds:
        <project-name>:
          table_option:"NO FALLBACK, NO JOURNAL"
      ```
      ```yaml
      seeds:
        <project-name>:
          table_option: "NO FALLBACK, NO JOURNAL, CHECKSUM = ON,
            NO MERGEBLOCKRATIO,
            WITH CONCURRENT ISOLATED LOADING FOR ALL"
      ```

  For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).
* `with_statistics` - should statistics be copied from the base table, e.g.:
    ```yaml
    {{
      config(
          materialized="table",
          with_statistics="true"
      )
    }}
    ```
    This option is not available for seeds as seeds do not use `CREATE TABLE ... AS` syntax.

    For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).

* `index` - defines table indices:
    ```ebnf
    [UNIQUE] PRIMARY INDEX [index_name] ( index_column_name [,...] ) |
    NO PRIMARY INDEX |
    PRIMARY AMP [INDEX] [index_name] ( index_column_name [,...] ) |
    PARTITION BY { partitioning_level | ( partitioning_level [,...] ) } |
    UNIQUE INDEX [ index_name ] [ ( index_column_name [,...] ) ] [loading] |
    INDEX [index_name] [ALL] ( index_column_name [,...] ) [ordering] [loading]
    [,...]
    ```
    where:
    * partitioning_level:
      ```ebnf
      { partitioning_expression |
        COLUMN [ [NO] AUTO COMPRESS |
        COLUMN [ [NO] AUTO COMPRESS ] [ ALL BUT ] column_partition ]
      } [ ADD constant ]
      ```
    * ordering:
      ```ebnf
      ORDER BY [ VALUES | HASH ] [ ( order_column_name ) ]
      ```
    * loading:
      ```ebnf
      WITH [NO] LOAD IDENTITY
      ```
    e.g.:
    * in sql materialization definition file:
      ```yaml
      {{
        config(
            materialized="table",
            index="UNIQUE PRIMARY INDEX ( GlobalID )"
        )
      }}
      ```
      > :information_source: Note, unlike in `table_option`, there are no commas between index statements!
      ```yaml
      {{
        config(
            materialized="table",
            index="PRIMARY INDEX(id)
            PARTITION BY RANGE_N(create_date
                          BETWEEN DATE '2020-01-01'
                          AND     DATE '2021-01-01'
                          EACH INTERVAL '1' MONTH)"
        )
      }}
      ```
      ```yaml
      {{
        config(
            materialized="table",
            index="PRIMARY INDEX(id)
            PARTITION BY RANGE_N(create_date
                          BETWEEN DATE '2020-01-01'
                          AND     DATE '2021-01-01'
                          EACH INTERVAL '1' MONTH)
            INDEX index_attrA (attrA) WITH LOAD IDENTITY"
        )
      }}
      ```
    * in seed configuration:
      ```yaml
      seeds:
        <project-name>:
          index: "UNIQUE PRIMARY INDEX ( GlobalID )"
      ```
      > :information_source: Note, unlike in `table_option`, there are no commas between index statements!
      ```yaml
      seeds:
        <project-name>:
          index: "PRIMARY INDEX(id)
            PARTITION BY RANGE_N(create_date
                          BETWEEN DATE '2020-01-01'
                          AND     DATE '2021-01-01'
                          EACH INTERVAL '1' MONTH)"
      ```
      ```yaml
      seeds:
        <project-name>:
          index: "PRIMARY INDEX(id)
            PARTITION BY RANGE_N(create_date
                          BETWEEN DATE '2020-01-01'
                          AND     DATE '2021-01-01'
                          EACH INTERVAL '1' MONTH)
            INDEX index_attrA (attrA) WITH LOAD IDENTITY"
      ```

#### Seeds

Seeds, in addition to the above materialization modifiers, have the following options:
* `use_fastload` - use [fastload](https://github.com/Teradata/python-driver#FastLoad) when handling `dbt seed` command. The option will likely speed up loading when your seed files have hundreds of thousands of rows. You can set this seed configuration option in your `project.yml` file, e.g.:
    ```yaml
    seeds:
      <project-name>:
        +use_fastload: true
    ```

#### Grants

Grants are supported in dbt-teradata adapter with release version 1.2.0 and above. You can use grants to manage access to the datasets you're producing with dbt. To implement these permissions, define grants as resource configs on each model, seed, or snapshot. Define the default grants that apply to the entire project in your `dbt_project.yml`, and define model-specific grants within each model's SQL or YAML file.

for e.g. :
  models/schema.yml
  ```yaml
  models:
    - name: model_name
      config:
        grants:
          select: ['user_a', 'user_b']
  ```

Another e.g. for adding multiple grants:

  ```yaml
  models:
  - name: model_name
    config:
      materialized: table
      grants:
        select: ["user_b"]
        insert: ["user_c"]
  ```
> :information_source: `copy_grants` is not supported in Teradata.

More on Grants can be found at https://docs.getdbt.com/reference/resource-configs/grants

### Cross DB macros
Starting with release 1.3, some macros were migrated from [teradata-dbt-utils](https://github.com/Teradata/dbt-teradata-utils) dbt package to the connector. See the table below for the macros supported from the connector.

For using cross DB macros, teradata-utils as a macro namespace will not be used, as cross DB macros have been migrated from teradata-utils to Dbt-Teradata.


#### Compatibility

|     Macro Group       |           Macro Name          |         Status        |                                 Comment                                |
|:---------------------:|:-----------------------------:|:---------------------:|:----------------------------------------------------------------------:|
| Cross-database macros | current_timestamp             | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | dateadd                       | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | datediff                      | :white_check_mark:    | custom macro provided, see [compatibility note](#datediff)             |
| Cross-database macros | split_part                    | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | date_trunc                    | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | hash                          | :white_check_mark:    | custom macro provided, see [compatibility note](#hash)                 |
| Cross-database macros | replace                       | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | type_string                   | :white_check_mark:    | custom macro provided                                                  |
| Cross-database macros | last_day                      | :white_check_mark:    | no customization needed, see [compatibility note](#last_day)           |
| Cross-database macros | width_bucket                  | :white_check_mark:    | no customization
| SQL generators        | generate_series               | :white_check_mark:    | custom macro provided
| SQL generators        | date_spine                    | :white_check_mark:    | no customization


#### examples for cross DB macros
Replace:
{{ dbt.replace("string_text_column", "old_chars", "new_chars") }}
{{ replace('abcgef', 'g', 'd') }}

Date truncate:
{{ dbt.date_trunc("date_part", "date") }}
{{ dbt.date_trunc("DD", "'2018-01-05 12:00:00'") }}

#### <a name="datediff"></a>datediff
`datediff` macro in teradata supports difference between dates. Differece between timestamps is not supported.

#### <a name="hash"></a>hash

`Hash` macro needs an `md5` function implementation. Teradata doesn't support `md5` natively. You need to install a User Defined Function (UDF):
1. Download the md5 UDF implementation from Teradata (registration required): https://downloads.teradata.com/download/extensibility/md5-message-digest-udf.
1. Unzip the package and go to `src` directory.
1. Start up `bteq` and connect to your database.
1. Create database `GLOBAL_FUNCTIONS` that will host the UDF. You can't change the database name as it's hardcoded in the macro:
    ```sql
    CREATE DATABASE GLOBAL_FUNCTIONS AS PERMANENT = 60e6, SPOOL = 120e6;
    ```
1. Create the UDF. Replace `<CURRENT_USER>` with your current database user:
    ```sql
    GRANT CREATE FUNCTION ON GLOBAL_FUNCTIONS TO <CURRENT_USER>;
    DATABASE GLOBAL_FUNCTIONS;
    .run file = hash_md5.btq
    ```
1. Grant permissions to run the UDF with grant option.
    ```sql
    GRANT EXECUTE FUNCTION ON GLOBAL_FUNCTIONS TO PUBLIC WITH GRANT OPTION;
    ```
#### <a name="last_day"></a>last_day

`last_day` in `teradata_utils`, unlike the corresponding macro in `dbt_utils`, doesn't support `quarter` datepart.

## Common Teradata-specific tasks
* *collect statistics* - when a table is created or modified significantly, there might be a need to tell Teradata to collect statistics for the optimizer. It can be done using `COLLECT STATISTICS` command. You can perform this step using dbt's `post-hooks`, e.g.:
  ```yaml
  {{ config(
    post_hook=[
      "COLLECT STATISTICS ON  {{ this }} COLUMN (column_1,  column_2  ...);"
      ]
  )}}
  ```
  See [Collecting Statistics documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/RAyUdGfvREwbO9J0DMNpLw) for more information.

## Support for model contracts
Model contracts are supported with dbt-teradata v1.7.1 and onwards.
Constraint support and enforcement in dbt-teradata

| Constraint type |	Support	Platform | enforcement |
|-----------------|------------------|-------------|
| not_null	      | ✅ Supported	 | ✅ Enforced |
| primary_key	  | ✅ Supported	 | ✅ Enforced |
| foreign_key	  | ✅ Supported	 | ✅ Enforced |
| unique	      | ✅ Supported	 | ✅ Enforced |
| check	          | ✅ Supported	 | ✅ Enforced |

To find more on model contracts please follow dbt documentations https://docs.getdbt.com/docs/collaborate/govern/model-contracts

## Support for `dbt-utils` package
`dbt-utils` package is supported through `teradata/teradata_utils` dbt package. The package provides a compatibility layer between `dbt_utils` and `dbt-teradata`. See [teradata_utils](https://hub.getdbt.com/teradata/teradata_utils/latest/) package for install instructions.

## Limitations

### Transaction mode
Both ANSI and TERA modes are now supported in dbt-teradata. TERA mode's support is introduced with dbt-teradata 1.7.1, it is an initial implementation.
###### IMPORTANT NOTE: This is an initial implementation of the TERA transaction mode and may not support some use cases. We strongly advise validating all records or transformations utilizing this mode to preempt any potential anomalies or errors

## Credits

The adapter was originally created by [Doug Beatty](https://github.com/dbeatty10). Teradata took over the adapter in January 2022. We are grateful to Doug for founding the project and accelerating the integration of dbt + Teradata.

## License

The adapter is published using Apache-2.0 License. Please see [the license](LICENSE) for terms and conditions, such as creating derivative work and the support model. 



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Teradata/dbt-teradata",
    "name": "dbt-teradata",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.12,>=3.8",
    "maintainer_email": null,
    "keywords": null,
    "author": "Teradata Corporation",
    "author_email": "developers@teradata.com",
    "download_url": "https://files.pythonhosted.org/packages/d8/ba/ae17d3ed6321b9f01d7e2e996a7ee8567494afccb1492a06424ed702968a/dbt-teradata-1.7.2.tar.gz",
    "platform": null,
    "description": "# dbt-teradata\n\nThe dbt Teradata adapter lets you use [dbt](https://getdbt.com) with Teradata Vantage.\n\n**_NOTE:_** This adapter is maintained by Teradata. We are accelerating our release cadence. Starting October 1st, 2023, we will release `dbt-teradata` within 4 weeks of a minor release or within 8 weeks of a major release of `dbt-core`.\n\n## Installation\n\n```\npip install dbt-teradata\n```\n\nIf you are new to dbt on Teradata see [dbt with Teradata Vantage tutorial](https://quickstarts.teradata.com/dbt.html).\n\n**_NOTE:_** If the virtual environment in Python is not activating properly on Windows, you can try running the below command in the command-line interface (CLI) before attempting to activate the virtual environment.\n\n```\nSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUse\n```\n\n## Sample profile\n\nHere is a working example of a `dbt-teradata` profile:\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: localhost\n      user: dbc\n      password: dbc\n      schema: dbt_test\n      tmode: ANSI\n```\n\nAt a minimum, you need to specify `host`, `user`, `password`, `schema` (database), `tmode`.\n\n## Python compatibility\n\n| Plugin version | Python 3.6  | Python 3.7  | Python 3.8  | Python 3.9  | Python 3.10 | Python 3.11  |\n| -------------- | ----------- | ----------- | ----------- | ----------- | ----------- | ------------ |\n| 0.19.0.x           | \u2705          | \u2705          | \u2705          | \u274c          | \u274c          | \u274c\n| 0.20.0.x           | \u2705          | \u2705          | \u2705          | \u2705          | \u274c          | \u274c\n| 0.21.1.x           | \u2705          | \u2705          | \u2705          | \u2705          | \u274c          | \u274c\n| 1.0.0.x           | \u274c           | \u2705          | \u2705          | \u2705          | \u274c          | \u274c\n|1.1.x.x            | \u274c           | \u2705          | \u2705          | \u2705          | \u2705          | \u274c\n|1.2.x.x            | \u274c           | \u2705          | \u2705          | \u2705          | \u2705          | \u274c\n|1.3.x.x            | \u274c           | \u2705          | \u2705          | \u2705          | \u2705          | \u274c\n|1.4.x.x            | \u274c           | \u2705          | \u2705          | \u2705          | \u2705          | \u2705\n|1.5.x              | \u274c           | \u2705          | \u2705          | \u2705          | \u2705          | \u2705\n|1.6.x              | \u274c           | \u274c          | \u2705          | \u2705          | \u2705          | \u2705\n|1.7.x              | \u274c           | \u274c          | \u2705          | \u2705          | \u2705          | \u2705\n\n\n##  dbt dependent packages version compatibility\n| dbt-teradata | dbt-core | dbt-teradata-util |  dbt-util      |\n|--------------|----------|-------------------|----------------|\n| 1.2.x        | 1.2.x    | 0.1.0             | 0.9.x or below |\n| 1.6.7        | 1.6.7    | 1.1.1             | 1.1.1          |\n| 1.7.x        | 1.7.x    | 1.1.1             | 1.1.1          |\n\n## Optional profile configurations\n\n### Logmech\n\nThe logon mechanism for Teradata jobs that dbt executes can be configured with the `logmech` configuration in your Teradata profile. The `logmech` field can be set to: `TD2`, `LDAP`, `KRB5`, `TDNEGO`. For more information on authentication options, go to [Teradata Vantage authentication documentation](https://docs.teradata.com/r/8Mw0Cvnkhv1mk1LEFcFLpw/0Ev5SyB6_7ZVHywTP7rHkQ).\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      user: <user>\n      password: <password>\n      schema: dbt_test\n      tmode: ANSI\n      logmech: LDAP\n```\n\n### Logdata\n\nThe logon mechanism for Teradata jobs that dbt executes can be configured with the `logdata` configuration in your Teradata profile. Addtional data like secure token, distinguished Name, or a domain/realm name can be set in your Teradata profile using `logdata`. The `logdata` field can be set to: `JWT`, `LDAP`, `KRB5`, `TDNEGO`. `logdata` is not used with the TD2 mechanism. \n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      schema: dbt_test\n      tmode: ANSI\n      logmech: LDAP\n      logdata: 'authcid=username password=password'\n      port: <port>\n```\n\nFor more information on authentication options, go to [Teradata Vantage authentication documentation](https://docs.teradata.com/r/8Mw0Cvnkhv1mk1LEFcFLpw/0Ev5SyB6_7ZVHywTP7rHkQ)\n\n### Stored Password Protection\n\nStored Password Protection enables an application to provide a connection password in encrypted form to the driver. The plugin supports Stored Password Protection feature through prefix `ENCRYPTED_PASSWORD(` either in `password` connection parameter  or in `logdata` connection parameter.\n\n* `password`\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      user: <user>\n      password: ENCRYPTED_PASSWORD(file:PasswordEncryptionKeyFileName,file:EncryptedPasswordFileName)\n      schema: dbt_test\n      tmode: ANSI\n      port: <port>\n```\n* `logdata`\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      schema: dbt_test\n      tmode: ANSI\n      logmech: LDAP\n      logdata: 'authcid=username password=ENCRYPTED_PASSWORD(file:PasswordEncryptionKeyFileName,file:EncryptedPasswordFileName)'\n      port: <port>\n```\n\nFor full description of Stored Password Protection see https://github.com/Teradata/python-driver#StoredPasswordProtection.\n\n\n### Port\n\nIf your Teradata database runs on port different than the default (1025), you can specify a custom port in your dbt profile using `port` configuration.\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      user: <user>\n      password: <password>\n      schema: dbt_test\n      tmode: ANSI\n      port: <port>\n```\n\n### Retries\n\nAllows an adapter to automatically try again when the attempt to open a new connection on the database has a transient, infrequent error. This option can be set using the `retries` configuration. Default value is 0. The default wait period between connection attempts is one second. `retry_timeout` (seconds) option allows us to adjust this waiting period.\n\nIf `retries` is set to 3, the adapter will try to establish a new connection three times if an error occurs.\n\n```yaml\nmy-teradata-db-profile:\n  target: dev\n  outputs:\n    dev:\n      type: teradata\n      host: <host>\n      user: <user>\n      password: <password>\n      schema: dbt_test\n      tmode: ANSI\n      retries: 3\n      retry_timeout: 10\n```\n\n### Other Teradata connection parameters\n\nThe plugin also supports the following Teradata connection parameters:\n* account\n* column_name\n* cop\n* coplast\n* encryptdata\n* fake_result_sets\n* field_quote\n* field_sep\n* lob_support\n* log\n* logdata\n* max_message_body\n* partition\n* sip_support\n* teradata_values\n* sslmode\n* sslca\n* sslcapath\n* sslcrc\n* sslcipher\n* sslprotocol\n* browser\n* browser_tab_timeout\n* browser_timeout\n* sp_spl\n* sessions\n* runstartup\n* logon_timeout\n* https_port\n* connect_timeout\n* request_timeout\n\nFor full description of the connection parameters see https://github.com/Teradata/python-driver#connection-parameters.\n\n## Supported Features\n\n### Materializations\n\n* `view`\n* `table`\n* `ephemeral`\n* `incremental`\n\n#### Incremental Materialization\nThe following incremental materialization strategies are supported:\n* `append` (default)\n* `delete+insert`\n* `merge`\n\nTo learn more about dbt incremental strategies please check [the dbt incremental strategy documentation](https://docs.getdbt.com/docs/build/incremental-models#about-incremental_strategy).\n\n### Commands\n\nAll dbt commands are supported.\n\n### Custom configurations\n\n#### General\n\n* *Enable view column types in docs* -  Teradata Vantage has a dbscontrol configuration flag called `DisableQVCI` (QVCI - Queryable View Column Index). This flag instructs the database to build `DBC.ColumnsJQV` with view column type definitions. \n\n    > :information_source: Existing customers, please see [KB0022230](https://support.teradata.com/knowledge?id=kb_article_view&sys_kb_id=d066248b1b0000187361c8415b4bcb48) for more information about enabling QVCI.\n\n  To enable this functionality you need to:\n  1. Enable QVCI mode in Vantage. Use `dbscontrol` utility and then restart Teradata. Run these commands as a privileged user on a Teradata node:\n      ```bash\n      # option 551 is DisableQVCI. Setting it to false enables QVCI.\n      dbscontrol << EOF\n      M internal 551=false\n      W\n      EOF\n\n      # restart Teradata\n      tpareset -y Enable QVCI\n      ```\n  2. Instruct `dbt` to use `QVCI` mode. Include the following variable in your `dbt_project.yml`:\n      ```yaml\n      vars:\n        use_qvci: true\n      ```\n      For example configuration, see `test/catalog/with_qvci/dbt_project.yml`.\n\n#### Models\n\n##### Table\n\nThe following options apply to table, snapshots and seed materializations.\n\n* `table_kind` - define the table kind. Legal values are `MULTISET` (default for ANSI transaction mode required by `dbt-teradata`) and `SET`, e.g.:\n    * in sql materialization definition file:\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            table_kind=\"SET\"\n        )\n      }}\n      ```\n    * in seed configuration:\n      ```yaml\n      seeds:\n        <project-name>:\n          table_kind: \"SET\"\n      ```\n  For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).\n* `table_option` - define table options. Legal values are:\n    ```ebnf\n    { MAP = map_name [COLOCATE USING colocation_name] |\n      [NO] FALLBACK [PROTECTION] |\n      WITH JOURNAL TABLE = table_specification |\n      [NO] LOG |\n      [ NO | DUAL ] [BEFORE] JOURNAL |\n      [ NO | DUAL | LOCAL | NOT LOCAL ] AFTER JOURNAL |\n      CHECKSUM = { DEFAULT | ON | OFF } |\n      FREESPACE = integer [PERCENT] |\n      mergeblockratio |\n      datablocksize |\n      blockcompression |\n      isolated_loading\n    }\n    ```\n    where:\n    * mergeblockratio:\n      ```ebnf\n      { DEFAULT MERGEBLOCKRATIO |\n        MERGEBLOCKRATIO = integer [PERCENT] |\n        NO MERGEBLOCKRATIO\n      }\n      ```\n    * datablocksize:\n      ```ebnf\n      DATABLOCKSIZE = {\n        data_block_size [ BYTES | KBYTES | KILOBYTES ] |\n        { MINIMUM | MAXIMUM | DEFAULT } DATABLOCKSIZE\n      }\n      ```\n    * blockcompression:\n      ```ebnf\n      BLOCKCOMPRESSION = { AUTOTEMP | MANUAL | ALWAYS | NEVER | DEFAULT }\n        [, BLOCKCOMPRESSIONALGORITHM = { ZLIB | ELZS_H | DEFAULT } ]\n        [, BLOCKCOMPRESSIONLEVEL = { value | DEFAULT } ]\n      ```\n    * isolated_loading:\n      ```ebnf\n      WITH [NO] [CONCURRENT] ISOLATED LOADING [ FOR { ALL | INSERT | NONE } ]\n      ```\n\n    Examples:\n    * in sql materialization definition file:\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            table_option=\"NO FALLBACK\"\n        )\n      }}\n      ```\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            table_option=\"NO FALLBACK, NO JOURNAL\"\n        )\n      }}\n      ```\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            table_option=\"NO FALLBACK, NO JOURNAL, CHECKSUM = ON,\n              NO MERGEBLOCKRATIO,\n              WITH CONCURRENT ISOLATED LOADING FOR ALL\"\n        )\n      }}\n      ```\n    * in seed configuration:\n      ```yaml\n      seeds:\n        <project-name>:\n          table_option:\"NO FALLBACK\"\n      ```\n      ```yaml\n      seeds:\n        <project-name>:\n          table_option:\"NO FALLBACK, NO JOURNAL\"\n      ```\n      ```yaml\n      seeds:\n        <project-name>:\n          table_option: \"NO FALLBACK, NO JOURNAL, CHECKSUM = ON,\n            NO MERGEBLOCKRATIO,\n            WITH CONCURRENT ISOLATED LOADING FOR ALL\"\n      ```\n\n  For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).\n* `with_statistics` - should statistics be copied from the base table, e.g.:\n    ```yaml\n    {{\n      config(\n          materialized=\"table\",\n          with_statistics=\"true\"\n      )\n    }}\n    ```\n    This option is not available for seeds as seeds do not use `CREATE TABLE ... AS` syntax.\n\n    For details, see [CREATE TABLE documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/B6Js16DRQVwPDjgJ8rz7hg).\n\n* `index` - defines table indices:\n    ```ebnf\n    [UNIQUE] PRIMARY INDEX [index_name] ( index_column_name [,...] ) |\n    NO PRIMARY INDEX |\n    PRIMARY AMP [INDEX] [index_name] ( index_column_name [,...] ) |\n    PARTITION BY { partitioning_level | ( partitioning_level [,...] ) } |\n    UNIQUE INDEX [ index_name ] [ ( index_column_name [,...] ) ] [loading] |\n    INDEX [index_name] [ALL] ( index_column_name [,...] ) [ordering] [loading]\n    [,...]\n    ```\n    where:\n    * partitioning_level:\n      ```ebnf\n      { partitioning_expression |\n        COLUMN [ [NO] AUTO COMPRESS |\n        COLUMN [ [NO] AUTO COMPRESS ] [ ALL BUT ] column_partition ]\n      } [ ADD constant ]\n      ```\n    * ordering:\n      ```ebnf\n      ORDER BY [ VALUES | HASH ] [ ( order_column_name ) ]\n      ```\n    * loading:\n      ```ebnf\n      WITH [NO] LOAD IDENTITY\n      ```\n    e.g.:\n    * in sql materialization definition file:\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            index=\"UNIQUE PRIMARY INDEX ( GlobalID )\"\n        )\n      }}\n      ```\n      > :information_source: Note, unlike in `table_option`, there are no commas between index statements!\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            index=\"PRIMARY INDEX(id)\n            PARTITION BY RANGE_N(create_date\n                          BETWEEN DATE '2020-01-01'\n                          AND     DATE '2021-01-01'\n                          EACH INTERVAL '1' MONTH)\"\n        )\n      }}\n      ```\n      ```yaml\n      {{\n        config(\n            materialized=\"table\",\n            index=\"PRIMARY INDEX(id)\n            PARTITION BY RANGE_N(create_date\n                          BETWEEN DATE '2020-01-01'\n                          AND     DATE '2021-01-01'\n                          EACH INTERVAL '1' MONTH)\n            INDEX index_attrA (attrA) WITH LOAD IDENTITY\"\n        )\n      }}\n      ```\n    * in seed configuration:\n      ```yaml\n      seeds:\n        <project-name>:\n          index: \"UNIQUE PRIMARY INDEX ( GlobalID )\"\n      ```\n      > :information_source: Note, unlike in `table_option`, there are no commas between index statements!\n      ```yaml\n      seeds:\n        <project-name>:\n          index: \"PRIMARY INDEX(id)\n            PARTITION BY RANGE_N(create_date\n                          BETWEEN DATE '2020-01-01'\n                          AND     DATE '2021-01-01'\n                          EACH INTERVAL '1' MONTH)\"\n      ```\n      ```yaml\n      seeds:\n        <project-name>:\n          index: \"PRIMARY INDEX(id)\n            PARTITION BY RANGE_N(create_date\n                          BETWEEN DATE '2020-01-01'\n                          AND     DATE '2021-01-01'\n                          EACH INTERVAL '1' MONTH)\n            INDEX index_attrA (attrA) WITH LOAD IDENTITY\"\n      ```\n\n#### Seeds\n\nSeeds, in addition to the above materialization modifiers, have the following options:\n* `use_fastload` - use [fastload](https://github.com/Teradata/python-driver#FastLoad) when handling `dbt seed` command. The option will likely speed up loading when your seed files have hundreds of thousands of rows. You can set this seed configuration option in your `project.yml` file, e.g.:\n    ```yaml\n    seeds:\n      <project-name>:\n        +use_fastload: true\n    ```\n\n#### Grants\n\nGrants are supported in dbt-teradata adapter with release version 1.2.0 and above. You can use grants to manage access to the datasets you're producing with dbt. To implement these permissions, define grants as resource configs on each model, seed, or snapshot. Define the default grants that apply to the entire project in your `dbt_project.yml`, and define model-specific grants within each model's SQL or YAML file.\n\nfor e.g. :\n  models/schema.yml\n  ```yaml\n  models:\n    - name: model_name\n      config:\n        grants:\n          select: ['user_a', 'user_b']\n  ```\n\nAnother e.g. for adding multiple grants:\n\n  ```yaml\n  models:\n  - name: model_name\n    config:\n      materialized: table\n      grants:\n        select: [\"user_b\"]\n        insert: [\"user_c\"]\n  ```\n> :information_source: `copy_grants` is not supported in Teradata.\n\nMore on Grants can be found at https://docs.getdbt.com/reference/resource-configs/grants\n\n### Cross DB macros\nStarting with release 1.3, some macros were migrated from [teradata-dbt-utils](https://github.com/Teradata/dbt-teradata-utils) dbt package to the connector. See the table below for the macros supported from the connector.\n\nFor using cross DB macros, teradata-utils as a macro namespace will not be used, as cross DB macros have been migrated from teradata-utils to Dbt-Teradata.\n\n\n#### Compatibility\n\n|     Macro Group       |           Macro Name          |         Status        |                                 Comment                                |\n|:---------------------:|:-----------------------------:|:---------------------:|:----------------------------------------------------------------------:|\n| Cross-database macros | current_timestamp             | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | dateadd                       | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | datediff                      | :white_check_mark:    | custom macro provided, see [compatibility note](#datediff)             |\n| Cross-database macros | split_part                    | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | date_trunc                    | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | hash                          | :white_check_mark:    | custom macro provided, see [compatibility note](#hash)                 |\n| Cross-database macros | replace                       | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | type_string                   | :white_check_mark:    | custom macro provided                                                  |\n| Cross-database macros | last_day                      | :white_check_mark:    | no customization needed, see [compatibility note](#last_day)           |\n| Cross-database macros | width_bucket                  | :white_check_mark:    | no customization\n| SQL generators        | generate_series               | :white_check_mark:    | custom macro provided\n| SQL generators        | date_spine                    | :white_check_mark:    | no customization\n\n\n#### examples for cross DB macros\nReplace:\n{{ dbt.replace(\"string_text_column\", \"old_chars\", \"new_chars\") }}\n{{ replace('abcgef', 'g', 'd') }}\n\nDate truncate:\n{{ dbt.date_trunc(\"date_part\", \"date\") }}\n{{ dbt.date_trunc(\"DD\", \"'2018-01-05 12:00:00'\") }}\n\n#### <a name=\"datediff\"></a>datediff\n`datediff` macro in teradata supports difference between dates. Differece between timestamps is not supported.\n\n#### <a name=\"hash\"></a>hash\n\n`Hash` macro needs an `md5` function implementation. Teradata doesn't support `md5` natively. You need to install a User Defined Function (UDF):\n1. Download the md5 UDF implementation from Teradata (registration required): https://downloads.teradata.com/download/extensibility/md5-message-digest-udf.\n1. Unzip the package and go to `src` directory.\n1. Start up `bteq` and connect to your database.\n1. Create database `GLOBAL_FUNCTIONS` that will host the UDF. You can't change the database name as it's hardcoded in the macro:\n    ```sql\n    CREATE DATABASE GLOBAL_FUNCTIONS AS PERMANENT = 60e6, SPOOL = 120e6;\n    ```\n1. Create the UDF. Replace `<CURRENT_USER>` with your current database user:\n    ```sql\n    GRANT CREATE FUNCTION ON GLOBAL_FUNCTIONS TO <CURRENT_USER>;\n    DATABASE GLOBAL_FUNCTIONS;\n    .run file = hash_md5.btq\n    ```\n1. Grant permissions to run the UDF with grant option.\n    ```sql\n    GRANT EXECUTE FUNCTION ON GLOBAL_FUNCTIONS TO PUBLIC WITH GRANT OPTION;\n    ```\n#### <a name=\"last_day\"></a>last_day\n\n`last_day` in `teradata_utils`, unlike the corresponding macro in `dbt_utils`, doesn't support `quarter` datepart.\n\n## Common Teradata-specific tasks\n* *collect statistics* - when a table is created or modified significantly, there might be a need to tell Teradata to collect statistics for the optimizer. It can be done using `COLLECT STATISTICS` command. You can perform this step using dbt's `post-hooks`, e.g.:\n  ```yaml\n  {{ config(\n    post_hook=[\n      \"COLLECT STATISTICS ON  {{ this }} COLUMN (column_1,  column_2  ...);\"\n      ]\n  )}}\n  ```\n  See [Collecting Statistics documentation](https://docs.teradata.com/r/76g1CuvvQlYBjb2WPIuk3g/RAyUdGfvREwbO9J0DMNpLw) for more information.\n\n## Support for model contracts\nModel contracts are supported with dbt-teradata v1.7.1 and onwards.\nConstraint support and enforcement in dbt-teradata\n\n| Constraint type |\tSupport\tPlatform | enforcement |\n|-----------------|------------------|-------------|\n| not_null\t      | \u2705 Supported\t | \u2705 Enforced |\n| primary_key\t  | \u2705 Supported\t | \u2705 Enforced |\n| foreign_key\t  | \u2705 Supported\t | \u2705 Enforced |\n| unique\t      | \u2705 Supported\t | \u2705 Enforced |\n| check\t          | \u2705 Supported\t | \u2705 Enforced |\n\nTo find more on model contracts please follow dbt documentations https://docs.getdbt.com/docs/collaborate/govern/model-contracts\n\n## Support for `dbt-utils` package\n`dbt-utils` package is supported through `teradata/teradata_utils` dbt package. The package provides a compatibility layer between `dbt_utils` and `dbt-teradata`. See [teradata_utils](https://hub.getdbt.com/teradata/teradata_utils/latest/) package for install instructions.\n\n## Limitations\n\n### Transaction mode\nBoth ANSI and TERA modes are now supported in dbt-teradata. TERA mode's support is introduced with dbt-teradata 1.7.1, it is an initial implementation.\n###### IMPORTANT NOTE: This is an initial implementation of the TERA transaction mode and may not support some use cases. We strongly advise validating all records or transformations utilizing this mode to preempt any potential anomalies or errors\n\n## Credits\n\nThe adapter was originally created by [Doug Beatty](https://github.com/dbeatty10). Teradata took over the adapter in January 2022. We are grateful to Doug for founding the project and accelerating the integration of dbt + Teradata.\n\n## License\n\nThe adapter is published using Apache-2.0 License. Please see [the license](LICENSE) for terms and conditions, such as creating derivative work and the support model. \n\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "The Teradata adapter plugin for dbt (data build tool)",
    "version": "1.7.2",
    "project_urls": {
        "Homepage": "https://github.com/Teradata/dbt-teradata"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e06e15af56e6fd8c9d0f12626c5b56af8d420ebf8951812827bddd08a68949ab",
                "md5": "dd2358bccc1c44a3e2ae8d229a604b09",
                "sha256": "566aafa7b6d1e8da088bb4c84a00e09146c7adac9bf9ea786c04bd774d2855b7"
            },
            "downloads": -1,
            "filename": "dbt_teradata-1.7.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "dd2358bccc1c44a3e2ae8d229a604b09",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.12,>=3.8",
            "size": 44505,
            "upload_time": "2024-04-02T12:15:41",
            "upload_time_iso_8601": "2024-04-02T12:15:41.407027Z",
            "url": "https://files.pythonhosted.org/packages/e0/6e/15af56e6fd8c9d0f12626c5b56af8d420ebf8951812827bddd08a68949ab/dbt_teradata-1.7.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d8baae17d3ed6321b9f01d7e2e996a7ee8567494afccb1492a06424ed702968a",
                "md5": "5a2820b1b237f5e63c0924ebefab5bec",
                "sha256": "1a4f5011ce0dbbac13b455342eab66c40787f52f2d424483fb2423e99b7def4b"
            },
            "downloads": -1,
            "filename": "dbt-teradata-1.7.2.tar.gz",
            "has_sig": false,
            "md5_digest": "5a2820b1b237f5e63c0924ebefab5bec",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.12,>=3.8",
            "size": 42864,
            "upload_time": "2024-04-02T12:15:43",
            "upload_time_iso_8601": "2024-04-02T12:15:43.707000Z",
            "url": "https://files.pythonhosted.org/packages/d8/ba/ae17d3ed6321b9f01d7e2e996a7ee8567494afccb1492a06424ed702968a/dbt-teradata-1.7.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-02 12:15:43",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Teradata",
    "github_project": "dbt-teradata",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "dbt-teradata"
}
        
Elapsed time: 0.20596s