This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 38a3fbdc33 feat: use a new official CH driver: clickhouse-connect
(#22039)
38a3fbdc33 is described below
commit 38a3fbdc33292204bcb28f3e433fda7561035fb6
Author: EugeneTorap <[email protected]>
AuthorDate: Wed Nov 16 21:53:15 2022 +0300
feat: use a new official CH driver: clickhouse-connect (#22039)
---
docs/docs/databases/clickhouse.mdx | 14 +++----
.../docs/databases/installing-database-drivers.mdx | 2 +-
setup.py | 2 +-
.../db_engine_specs/clickhouse_tests.py | 47 ----------------------
.../unit_tests/db_engine_specs/test_clickhouse.py | 46 +++++++++++++++++++++
5 files changed, 55 insertions(+), 56 deletions(-)
diff --git a/docs/docs/databases/clickhouse.mdx
b/docs/docs/databases/clickhouse.mdx
index 7afcc50c15..424e50da93 100644
--- a/docs/docs/databases/clickhouse.mdx
+++ b/docs/docs/databases/clickhouse.mdx
@@ -10,33 +10,33 @@ version: 1
To use ClickHouse with Superset, you will need to add the following Python
library:
```
-clickhouse-sqlalchemy>=0.2.2
+clickhouse-connect>=0.4.1
```
If running Superset using Docker Compose, add the following to your
`./docker/requirements-local.txt` file:
```
-clickhouse-sqlalchemy>=0.2.2
+clickhouse-connect>=0.4.1
```
The recommended connector library for ClickHouse is
-[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse).
+[clickhouse-connect](https://github.com/ClickHouse/clickhouse-connect).
The expected connection string is formatted as follows:
```
-clickhouse+native://<user>:<password>@<host>:<port>/<database>[?options…]clickhouse://{username}:{password}@{hostname}:{port}/{database}
+clickhousedb://<user>:<password>@<host>:<port>/<database>[?options…]clickhouse://{username}:{password}@{hostname}:{port}/{database}
```
Here's a concrete example of a real connection string:
```
-clickhouse+native://demo:[email protected]/default?secure=true
+clickhousedb://demo:[email protected]/default?secure=true
```
-If you're using Clickhouse locally on your computer, you can get away with
using a native protocol URL that
+If you're using Clickhouse locally on your computer, you can get away with
using a http protocol URL that
uses the default user without a password (and doesn't encrypt the connection):
```
-clickhouse+native://localhost/default
+clickhousedb://localhost/default
```
diff --git a/docs/docs/databases/installing-database-drivers.mdx
b/docs/docs/databases/installing-database-drivers.mdx
index c2dc1159e6..01c85bc0e1 100644
--- a/docs/docs/databases/installing-database-drivers.mdx
+++ b/docs/docs/databases/installing-database-drivers.mdx
@@ -35,7 +35,7 @@ A list of some of the recommended packages.
| [Ascend.io](/docs/databases/ascend) | `pip install
impyla` |
`ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true`
|
| [Azure MS SQL](/docs/databases/sql-server) | `pip install
pymssql` |
`mssql+pymssql://UserName@presetSQL:[email protected]:1433/TestSchema`
|
| [Big Query](/docs/databases/bigquery) | `pip install
pybigquery` |
`bigquery://{project_id}`
|
-| [ClickHouse](/docs/databases/clickhouse) | `pip install
clickhouse-sqlalchemy` |
`clickhouse+native://{username}:{password}@{hostname}:{port}/{database}`
|
+| [ClickHouse](/docs/databases/clickhouse) | `pip install
clickhouse-connect` |
`clickhousedb://{username}:{password}@{hostname}:{port}/{database}`
|
| [CockroachDB](/docs/databases/cockroachdb) | `pip install
cockroachdb` |
`cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable`
|
| [Dremio](/docs/databases/dremio) | `pip install
sqlalchemy_dremio` |
`dremio://user:pwd@host:31010/`
|
| [Elasticsearch](/docs/databases/elasticsearch) | `pip install
elasticsearch-dbapi` |
`elasticsearch+http://{user}:{password}@{host}:9200/`
|
diff --git a/setup.py b/setup.py
index fb05f2248c..d2b950c6a4 100644
--- a/setup.py
+++ b/setup.py
@@ -130,7 +130,7 @@ setup(
"pybigquery>=0.4.10",
"google-cloud-bigquery>=2.4.0",
],
- "clickhouse": ["clickhouse-sqlalchemy>=0.2.2, <0.3"],
+ "clickhouse": ["clickhouse-connect>=0.4.1, <0.5"],
"cockroachdb": ["cockroachdb>=0.3.5, <0.4"],
"cors": ["flask-cors>=2.0.0"],
"crate": ["crate[sqlalchemy]>=0.26.0, <0.27"],
diff --git a/tests/integration_tests/db_engine_specs/clickhouse_tests.py
b/tests/integration_tests/db_engine_specs/clickhouse_tests.py
deleted file mode 100644
index c8019a8758..0000000000
--- a/tests/integration_tests/db_engine_specs/clickhouse_tests.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-from unittest import mock
-
-import pytest
-
-from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec
-from superset.db_engine_specs.exceptions import SupersetDBAPIDatabaseError
-from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec
-
-
-class TestClickHouseDbEngineSpec(TestDbEngineSpec):
- def test_convert_dttm(self):
- dttm = self.get_dttm()
-
- self.assertEqual(
- ClickHouseEngineSpec.convert_dttm("DATE", dttm),
"toDate('2019-01-02')"
- )
-
- self.assertEqual(
- ClickHouseEngineSpec.convert_dttm("DATETIME", dttm),
- "toDateTime('2019-01-02 03:04:05')",
- )
-
- def test_execute_connection_error(self):
- from urllib3.exceptions import NewConnectionError
-
- cursor = mock.Mock()
- cursor.execute.side_effect = NewConnectionError(
- "Dummypool", message="Exception with sensitive data"
- )
- with pytest.raises(SupersetDBAPIDatabaseError) as ex:
- ClickHouseEngineSpec.execute(cursor, "SELECT col1 from table1")
diff --git a/tests/unit_tests/db_engine_specs/test_clickhouse.py
b/tests/unit_tests/db_engine_specs/test_clickhouse.py
new file mode 100644
index 0000000000..ca01c304f6
--- /dev/null
+++ b/tests/unit_tests/db_engine_specs/test_clickhouse.py
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from datetime import datetime
+from unittest import mock
+
+import pytest
+
+from tests.unit_tests.fixtures.common import dttm
+
+
+def test_convert_dttm(dttm: datetime) -> None:
+ from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec
+
+ assert ClickHouseEngineSpec.convert_dttm("DATE", dttm) ==
"toDate('2019-01-02')"
+ assert (
+ ClickHouseEngineSpec.convert_dttm("DATETIME", dttm)
+ == "toDateTime('2019-01-02 03:04:05')"
+ )
+
+
+def test_execute_connection_error() -> None:
+ from urllib3.exceptions import NewConnectionError
+
+ from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec
+ from superset.db_engine_specs.exceptions import SupersetDBAPIDatabaseError
+
+ cursor = mock.Mock()
+ cursor.execute.side_effect = NewConnectionError(
+ "Dummypool", "Exception with sensitive data"
+ )
+ with pytest.raises(SupersetDBAPIDatabaseError) as ex:
+ ClickHouseEngineSpec.execute(cursor, "SELECT col1 from table1")