Skip to main content

CLI for converting DBT SQL models into multiple dialects.

Project description

🚀 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 supported SQL dialects. ✅ Translate dbt models across supported SQL dialects
✅ Retains dbt Jinja templating: {{ ref('...') }}, {{ var('...') }}
✅ Bulk model conversion support
✅ Intuitive CLI: dbt run -m-like syntax
✅ LLM-powered translation via OpenAI, Groq, Google, 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

🔧 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

Blog

Check out dbt-sqlx in blog! 👇

GenAI + dbt = dbt-sqlx: The Easiest Way to Switch SQL Dialects 💫

🎯 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'

🧪 Supported Dialects (so far)

Here’s what’s currently supported dialect, use it as --target-sql values

  • Redshift
  • Snowflake
  • BigQuery
  • Postgres
  • MySQL
  • Oracle
  • Spark-SQL
  • SQL-Server
  • Db2
  • ClickHouse
  • DuckDB
  • Databrick-Sql
  • Trino
  • Vertica
  • Athena
  • Presto
  • Google-Alloy-DB
  • MariaDB
  • Presto
  • Apache-Hive
  • SQLite

⚠️ 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dbt_sqlx-1.3.0.tar.gz (15.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dbt_sqlx-1.3.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file dbt_sqlx-1.3.0.tar.gz.

File metadata

  • Download URL: dbt_sqlx-1.3.0.tar.gz
  • Upload date:
  • Size: 15.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.0 CPython/3.10.12 Linux/5.15.167.4-microsoft-standard-WSL2

File hashes

Hashes for dbt_sqlx-1.3.0.tar.gz
Algorithm Hash digest
SHA256 73eb9b47c5926171f365ea5c618c3609695d0dccd26f72d398c7c676b96a7d0f
MD5 b68cfc72178c24e045f15c74718b01c7
BLAKE2b-256 d823fe7ce37cc8909f663564258dba26e7ab950e733e0852797df552fd23ccc1

See more details on using hashes here.

File details

Details for the file dbt_sqlx-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: dbt_sqlx-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.0 CPython/3.10.12 Linux/5.15.167.4-microsoft-standard-WSL2

File hashes

Hashes for dbt_sqlx-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9895e1678edefeb4f3d9fd14e5d8089473b7abc6a859bd89f704742d456a8306
MD5 34dbdae2dd45f93b5a8671af4facdb27
BLAKE2b-256 3887be03c4839c50de2e0f8b73642a98862ec03c7342e8b3dabd9dbd64bdaa30

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page