Skip to content

codep-ai/dbt-sqlx

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ dbt-sqlx

A CLI to convert SQL models across database dialects in your dbt projects.

SQL Translator
Python


πŸ” Why dbt-sqlx?

Tired of rewriting SQL logic every time your data platform changes?

Whether you're:

  • Migrating from one SQL type to another type like Snowflake to Redshift and many more
  • Porting models between versions such as oracle 11g to oracle 19c.
  • Maintaining compatibility across clouds

dbt-sqlx automates the hard part β€” letting you focus on insights, not syntax.


✨ Features

βœ… Translate dbt models across popular SQL dialects:
 Snowflake, Redshift, PostgreSQL, MySQL, Oracle, BigQuery, Spark-SQL, SQL Server
βœ… Retains dbt Jinja templating: {{ ref('...') }}, {{ var('...') }}
βœ… Bulk model conversion support
βœ… Intuitive CLI: dbt run -m-like syntax
βœ… LLM-powered translation via OpenAI, Groq, Anthropic, etc.
βœ… Fully configurable through CLI or .env
βœ… SQL version-aware translation (e.g., Oracle 11g vs 19c)
βœ… Auto-detects source dialect from dbt metadata

πŸ“‹ Pre-requisite

  • Python 3.10+

  • A dbt project with models

  • API key and model name for one of the following providers:

πŸ”§ CLI Commands

dbt-sqlx provide two main method config and trasnpile. Both method support multiple options. Below are the details:

  dbt-sqlx --help

1. config

Set or update default LLM provider, model and Key. It store configuration at ~/.dbt-sqlx/.env.

dbt-sqlx config --help

πŸ› οΈ CLI Command Options (config)

Option Required? Description Default Value
--llm-provider βšͺ Optional Set or update the default LLM provider Not set
--llm-model βšͺ Optional Set or update the default LLM model Not set
--api-key βšͺ Optional Provide or update your provider API key Not set

πŸ“Œ Example:

Prompt

dbt-sqlx config

Output

Updating dbt-sqlx environment settings...
Select model provider:
  1. OpenAI
  2. Groq
  3. Anthropic
  4. Mistral
  5. Cohere
  6. Google
  7. Azure
Enter your choice (1 to 7): 1
Enter the model name (e.g., gpt-4o, mixtral-8x7b): gpt-4o
The provider OpenAI API Key already configured, Do you want to overwrite? [Y-Yes, N-No]: Y
Enter API key for OpenAI: 
Successfully configured below configuration:
Default Provider -> OpenAI
Default LLM Model -> gpt-4o
Default Provider API Key -> sk-proj-******************************ht4GS5YA

Single Command

dbt-sqlx config --llm-provider OpenAI --llm-model gpt-4o --api-key sk-xxxxxxxxxx

2. transpile

Convert dbt models to the target dialect. It create new directory named as models_target_sql in your dbt project to avoid unintentially overwrite existing models.

dbt-sqlx transpile --help

Options

πŸ› οΈ CLI Command Options (transpile)

Option Required? Description Default Value
--target-sql 🟒 Required Target SQL dialect (e.g., oracle, snowflake, redshift) β€”
--target-sql-version βšͺ Optional Target SQL version (e.g., 11g, 19c for Oracle) latest
--source-sql βšͺ Optional Source SQL dialect (auto-detected if omitted) Auto-detected
--dbt-project βšͺ Optional Path to your dbt project Current directory (pwd)
--models βšͺ Optional Comma-separated list of specific dbt models to transpile All models
--llm-provider βšͺ Optional Override default LLM provider (e.g., OpenAI, Groq) Configured provider
--llm-model βšͺ Optional Override default LLM model Configured model
--verbose βšͺ Optional Enable logging of LLM Provider and Model during execution False

πŸ“Œ Example:

Below is the exmaple of transpile specific models dim_customer & dim_order of the dbt project named as dbt-ecom into Oracle.

dbt-sqlx transpile --target-sql oracle --dbt-project ~/dbt/dbt-ecom/ --models dim_customer,dim_order

⚑Quick Start

πŸ“¦ Installation

Install the dbt-sqlx from PyPI.

pip install dbt-sqlx

βœ… Verify Installation

dbt-sqlx --version

output

dbt-sqlx version x.x.x

βš™οΈ Configuration

Set up your default LLM provider, model, and API key:

dbt-sqlx config

You'll be prompted to enter:

  • LLM Provider (e.g., OpenAI, Groq)
  • Model Name (e.g., gpt-4, mixtral)
  • API Key (input hidden for security)

Alternatively, you can use one line command to configure default Provider and Model:

dbt-sqlx config --llm-provider your-llm-provider --llm-model your-llm-model --api-key your-api-key
# Example 
dbt-sqlx config --llm-provider Groq --llm-model llama-3.3-70b-specdec  --api-key ] gsk_ob**********LhiB

πŸš€ Usage

Convert all dbt Project's models

dbt-sqlx transpile --target-sql your-sql-type --dbt-project /path/to/dbt-project
# Example
dbt-sqlx transpile --target-sql oracle --dbt-project /path/to/dbt-project

🎯 Convert Specific Models

dbt-sqlx transpile --target-sql snowflake --dbt-project /path/to/project --models model1,model2

πŸŽ₯ Demo

Check out dbt-sqlx in action! πŸ‘‡

dbt-sqlx in Action

🎯 Use Cases

🧾 Input (Snowflake SQL):

SELECT
    user_id,
    first_name,
    CURRENT_TIMESTAMP AS refreshed_at
FROM {{ ref('dim_customers') }}
dbt-sqlx transpile --target-sql redshift --dbt-project your-dbt-project-path

πŸ” Output (Redshift):

SELECT
    user_id,
    first_name,
    GETDATE() AS refreshed_at
FROM {{ ref('dim_customers') }}

🧾 Input (Snowflake SQL):

SELECT customer_id,
       LISTAGG(DISTINCT first_name, ', ') WITHIN GROUP (ORDER BY first_name) AS customers
FROM {{ ref('dim_customers') }}
GROUP BY customer_id;
dbt-sqlx transpile --target-sql oracle --target-sql-version 11g --dbt-project your-dbt-project-path

πŸ” Output (Oracle 11g):

SELECT customer_id,
       RTRIM(XMLAGG(XMLELEMENT(e, first_name || ', ') ORDER BY first_name).EXTRACT('//text()'), ', ') AS customers
FROM (
    SELECT DISTINCT customer_id, first_name
    FROM {{ ref('dim_customers') }}
) 
GROUP BY customer_id;
dbt-sqlx transpile --target-sql oracle --target-sql-version 19c --dbt-project your-dbt-project-path

πŸ” Output (Oracle 19c):

SELECT customer_id,
       LISTAGG(first_name, ', ') WITHIN GROUP (ORDER BY first_name) AS customers
FROM (
    SELECT DISTINCT customer_id, first_name
    FROM {{ ref('dim_customers') }}
) subquery
GROUP BY customer_id;

Sample Configuration

Below are some sample configuration of LLM providers and models:

Groq

LLM_Provider = "Groq"
LLM_Name = 'llama-3.3-70b-versatile'
LLM_Provider_Key = 'gsk_*************************TLhiB'

Open AI

LLM_Provider = "OpenAI"
LLM_Name = 'gpt-4o'
LLM_Provider_Key = sk-proj-*****************************5YA

Google GenAI

LLM_Provider = "Google_Genai"
LLM_Name = 'gemini-2.0-flash'
LLM_Provider_Key = 'AI******************************7k'

Mistral AI

LLM_Provider = "MistralAI"
LLM_Name = 'mistral-small-latest'
LLM_Provider_Key = 'a2**************************ya0'

⚠️ Important Notes

  • dbt-sqlx uses LLM models β€” do not use if your code is under strict data security policies.
  • Accuracy may vary depending on the LLM β€” always review and test translated code.
  • It does not overwrite original models. Output is stored in a direcotry named as models with suffix target SQL type 'models_<target_SQL>' like models_oracle/.

πŸ“„ License

This project is licensed under the MIT License – see the LICENSE file for details.

πŸ“¬ Contact

πŸ‘¨β€πŸ’» Author: Nikhil Suthar
πŸ“§ Email

About

A CLI to convert SQL models across database dialects in your dbt projects.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 91.4%
  • Shell 8.6%