Skip to content

Commit 25f4f34

Browse files
feat: add ClickHouse support and related migrations (#38)
1 parent e7248d6 commit 25f4f34

31 files changed

+765
-30
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
integration-tests:
4343
strategy:
4444
matrix:
45-
dialect: [mysql, postgresql, sqlite, mssql]
45+
dialect: [mysql, postgresql, sqlite, mssql, clickhouse]
4646
runs-on: ubuntu-latest
4747
steps:
4848
- uses: actions/checkout@v4

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ The provider supports the following databases:
131131
* PostgreSQL
132132
* SQLite
133133
* Microsoft SQL Server
134+
* ClickHouse
134135

135136
### FAQ
136137

atlas_provider_sqlalchemy/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Dialect(str, Enum):
2323
postgresql = "postgresql"
2424
sqlite = "sqlite"
2525
mssql = "mssql"
26+
clickhouse = "clickhouse"
2627

2728

2829
def run(

poetry.lock

Lines changed: 643 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ packages = [{include = "atlas_provider_sqlalchemy"}]
1010
python = "^3.9"
1111
typer = ">0.9.0,<=1.0.0"
1212
sqlalchemy = "^2.0.41"
13+
clickhouse-sqlalchemy = "^0.3.2"
1314

1415
[tool.pyrefly]
1516
project-includes = [

tests/atlas-script.hcl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ locals {
88
postgresql = "docker://postgres/15"
99
sqlite = "sqlite://?mode=memory&_fk=1"
1010
mssql = "docker://sqlserver/2022-latest"
11+
clickhouse = "docker://clickhouse/25.9/dev"
1112
}[var.dialect]
1213
}
1314

@@ -17,7 +18,7 @@ data "external_schema" "sqlalchemy" {
1718
"run",
1819
"python3",
1920
"load_models.py",
20-
var.dialect, // mysql | postgresql | sqlite | mssql
21+
var.dialect, // mysql | postgresql | sqlite | mssql | clickhouse
2122
]
2223
}
2324

tests/atlas-standalone.hcl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ locals {
1313
postgresql = "docker://postgres/15"
1414
sqlite = "sqlite://?mode=memory&_fk=1"
1515
mssql = "docker://sqlserver/2022-latest"
16+
clickhouse = "docker://clickhouse/23.11/dev"
1617
}[var.dialect]
1718
}
1819

@@ -23,7 +24,7 @@ data "external_schema" "sqlalchemy" {
2324
"python3",
2425
"../atlas_provider_sqlalchemy/main.py",
2526
"--path", var.path,
26-
"--dialect", var.dialect, // mysql | postgresql | sqlite | mssql
27+
"--dialect", var.dialect, // mysql | postgresql | sqlite | mssql | clickhouse
2728
]
2829
}
2930

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- Create "address" table
2+
CREATE TABLE `address` (
3+
`id` Int32,
4+
`email_address` FixedString(30),
5+
`user_id` Int32
6+
) ENGINE = MergeTree
7+
PRIMARY KEY (`id`) ORDER BY (`id`) SETTINGS index_granularity = 8192;
8+
-- Create "user_account" table
9+
CREATE TABLE `user_account` (
10+
`id` Int32,
11+
`name` FixedString(30),
12+
`fullname` FixedString(30)
13+
) ENGINE = MergeTree
14+
PRIMARY KEY (`id`) ORDER BY (`id`) SETTINGS index_granularity = 8192;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
h1:erjqmA/a6B0TjDxdO09+CH0ToQUBXoN9Nhos0cswMpc=
2+
20251007100727.sql h1:sOg0sT6jinsVMTDsIeArCpUIcljWYu4lmBqLPuBKGQo=

tests/test_main.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
[
2424
(Dialect.postgresql, "tests/testdata/models/ddl_postgres.sql"),
2525
(Dialect.mysql, "tests/testdata/models/ddl_mysql.sql"),
26+
(Dialect.clickhouse, "tests/testdata/models/ddl_clickhouse.sql"),
2627
],
2728
)
2829
def test_run_models(
@@ -44,6 +45,7 @@ def test_run_models(
4445
[
4546
(Dialect.postgresql, "tests/testdata/old_models/ddl_postgres.sql"),
4647
(Dialect.mysql, "tests/testdata/old_models/ddl_mysql.sql"),
48+
(Dialect.clickhouse, "tests/testdata/old_models/ddl_clickhouse.sql"),
4749
],
4850
)
4951
def test_run_old_models(
@@ -65,6 +67,7 @@ def test_run_old_models(
6567
[
6668
(Dialect.postgresql, "tests/testdata/structured_models/ddl_postgres.sql"),
6769
(Dialect.mysql, "tests/testdata/structured_models/ddl_mysql.sql"),
70+
(Dialect.clickhouse, "tests/testdata/structured_models/ddl_clickhouse.sql"),
6871
],
6972
)
7073
def test_run_structured_models(
@@ -83,7 +86,7 @@ def test_run_structured_models(
8386

8487
@pytest.mark.parametrize(
8588
"dialect",
86-
[Dialect.postgresql, Dialect.mysql],
89+
[Dialect.postgresql, Dialect.mysql, Dialect.clickhouse],
8790
)
8891
def test_run_multiple_paths(
8992
dialect: Dialect,
@@ -109,6 +112,7 @@ def test_run_multiple_paths(
109112
[
110113
(Dialect.postgresql, "tests/testdata/tables/ddl_postgres.sql"),
111114
(Dialect.mysql, "tests/testdata/tables/ddl_mysql.sql"),
115+
(Dialect.clickhouse, "tests/testdata/tables/ddl_clickhouse.sql"),
112116
],
113117
)
114118
def test_run_models_2(

0 commit comments

Comments
 (0)