Quick Start#

Installation#

pip install ddlglot

Basic Usage#

Creating Tables#

from ddlglot import create

# Simple table for PostgreSQL
sql = (
    create("table")
    .name("users")
    .column("id", "INT")
    .column("name", "VARCHAR(100)")
    .sql(dialect="postgres")
)

Output:

CREATE TABLE users (id INT, name VARCHAR(100))

Column Definitions#

from ddlglot import create

sql = (
    create("table")
    .name("orders")
    .column("id", "INT", pk=True, not_null=True)
    .column("total", "DECIMAL(10,2)", default=0)
    .column("active", "BOOLEAN", default=True)
    .sql(dialect="postgres")
)

Output:

CREATE TABLE orders (id INT NOT NULL, total DECIMAL(10, 2) DEFAULT 0, active BOOLEAN DEFAULT TRUE)

Table Constraints#

from ddlglot import create

sql = (
    create("table")
    .name("order_items")
    .column("order_id", "INT")
    .column("product_id", "INT")
    .primary_key("order_id", "product_id")
    .sql(dialect="postgres")
)

Output:

CREATE TABLE order_items (order_id INT, product_id INT, PRIMARY KEY (order_id, product_id))

Views and CTAS#

from ddlglot import create
from sqlglot import exp

# Create view
sql = (
    create("view")
    .name("active_users")
    .as_select(exp.select("*").from_("users").where("active = true"))
    .sql(dialect="postgres", pretty=True)
)

Output:

CREATE VIEW active_users AS
SELECT
  *
FROM users
WHERE active = TRUE

Dialect-Specific Features#

Spark+Delta#

from ddlglot import create

sql = (
    create("table")
    .name("events")
    .column("id", "INT")
    .column("event_date", "DATE")
    .using("delta")
    .partitioned_by("event_date")
    .location("s3://warehouse/events/")
    .sql(dialect="spark", pretty=True)
)

Output:

CREATE TABLE events (
  id INT,
  event_date DATE
)
USING DELTA
PARTITIONED BY (event_date)
LOCATION 's3://warehouse/events/'

Hive#

from ddlglot import create

sql = (
    create("table")
    .name("events")
    .column("id", "INT")
    .stored_as("PARQUET")
    .row_format("DELIMITED")
    .location("/warehouse/events/")
    .sql(dialect="hive", pretty=True)
)

Output:

CREATE TABLE events (
  id INT
)
ROW FORMAT DELIMITED
STORED AS PARQUET
LOCATION '/warehouse/events/'

BigQuery#

BigQuery uses INT64 and STRING instead of INT and VARCHAR:

from ddlglot import create

sql = (
    create("table")
    .name("project.dataset.events")
    .column("id", "INT")
    .column("name", "VARCHAR(100)")  # VARCHAR is translated to STRING
    .partitioned_by("event_date")
    .sql(dialect="bigquery", pretty=True)
)

Output:

CREATE TABLE project.dataset.events (
  id INT64,
  name STRING
)
PARTITION BY event_date

SQLite#

SQLite uses INTEGER instead of INT:

from ddlglot import create

sql = create("table").name("users").column("id", "INT").sql(dialect="sqlite")

Output:

CREATE TABLE users (id INTEGER)

Pretty Printing#

from ddlglot import create

sql = (
    create("table")
    .name("users")
    .column("id", "INT")
    .column("name", "VARCHAR(100)")
    .column("email", "VARCHAR(255)")
    .sql(dialect="postgres", pretty=True, max_text_width=50)
)

Output:

CREATE TABLE users (
  id INT,
  name VARCHAR(100),
  email VARCHAR(255)
)