A CLI to convert SQL models across database dialects in your dbt projects.
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.
β
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
-
Python 3.10+
-
A dbt project with models
-
API key and model name for one of the following providers:
- Groq β Free Tier
- OpenAI β Paid
- Anthropic β Paid
- Google-GenAI-Free Tier
- MistralAI-Free Tier
dbt-sqlx
provide two main method config
and trasnpile
. Both method support multiple options. Below are the details:
dbt-sqlx --help
Set or update default LLM provider, model and Key. It store configuration at ~/.dbt-sqlx/.env
.
dbt-sqlx config --help
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
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
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
Install the dbt-sqlx from PyPI.
pip install dbt-sqlx
dbt-sqlx --version
output
dbt-sqlx version x.x.x
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
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
Check out dbt-sqlx in action! π
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
SELECT
user_id,
first_name,
GETDATE() AS refreshed_at
FROM {{ ref('dim_customers') }}
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
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
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;
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/
.
This project is licensed under the MIT License β see the LICENSE file for details.
π¨βπ» Author: Nikhil Suthar
π§ Email