This is an automated email from the ASF dual-hosted git repository. rusackas pushed a commit to branch feat/add-db-engine-specs in repository https://gitbox.apache.org/repos/asf/superset.git
commit 47e3172da53807e259b73df255ebe3133b683c7a Author: Evan Rusackas <[email protected]> AuthorDate: Thu Feb 12 16:33:48 2026 -0800 feat(db-engine-specs): add engine specs for PostGIS, DoltDB, TiDB, QuestDB, and Timeplus Add database engine specs with metadata and logos for five databases: - PostGIS: PostgreSQL-compatible spatial database extension - DoltDB: MySQL-compatible version-controlled database - TiDB: MySQL-compatible distributed HTAP database - QuestDB: High-performance time-series database - Timeplus: Streaming-first analytics platform Also fixes MSSQL's logo reference (msql.png → mssql-server.png). Co-Authored-By: Claude Opus 4.5 <[email protected]> --- superset-frontend/src/assets/images/doltdb.png | Bin 0 -> 5838 bytes superset-frontend/src/assets/images/postgis.svg | Bin 0 -> 94811 bytes superset-frontend/src/assets/images/questdb.png | Bin 0 -> 53162 bytes superset-frontend/src/assets/images/tidb.svg | Bin 0 -> 2139 bytes superset-frontend/src/assets/images/timeplus.svg | Bin 0 -> 9072 bytes superset/db_engine_specs/doltdb.py | 49 +++++++++++++++ superset/db_engine_specs/mssql.py | 2 +- superset/db_engine_specs/postgis.py | 53 ++++++++++++++++ superset/db_engine_specs/questdb.py | 62 +++++++++++++++++++ superset/db_engine_specs/tidb.py | 74 +++++++++++++++++++++++ superset/db_engine_specs/timeplus.py | 63 +++++++++++++++++++ 11 files changed, 302 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/assets/images/doltdb.png b/superset-frontend/src/assets/images/doltdb.png new file mode 100644 index 00000000000..23740015101 Binary files /dev/null and b/superset-frontend/src/assets/images/doltdb.png differ diff --git a/superset-frontend/src/assets/images/postgis.svg b/superset-frontend/src/assets/images/postgis.svg new file mode 100644 index 00000000000..ea09e7f38cc Binary files /dev/null and b/superset-frontend/src/assets/images/postgis.svg differ diff --git a/superset-frontend/src/assets/images/questdb.png b/superset-frontend/src/assets/images/questdb.png new file mode 100644 index 00000000000..fca78fcd463 Binary files /dev/null and b/superset-frontend/src/assets/images/questdb.png differ diff --git a/superset-frontend/src/assets/images/tidb.svg b/superset-frontend/src/assets/images/tidb.svg new file mode 100644 index 00000000000..50ddfe76084 Binary files /dev/null and b/superset-frontend/src/assets/images/tidb.svg differ diff --git a/superset-frontend/src/assets/images/timeplus.svg b/superset-frontend/src/assets/images/timeplus.svg new file mode 100644 index 00000000000..fc208f6ea91 Binary files /dev/null and b/superset-frontend/src/assets/images/timeplus.svg differ diff --git a/superset/db_engine_specs/doltdb.py b/superset/db_engine_specs/doltdb.py new file mode 100644 index 00000000000..e83b38b7094 --- /dev/null +++ b/superset/db_engine_specs/doltdb.py @@ -0,0 +1,49 @@ +# 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 superset.db_engine_specs.base import DatabaseCategory +from superset.db_engine_specs.mysql import MySQLEngineSpec + + +class DoltDBEngineSpec(MySQLEngineSpec): + """ + Engine spec for DoltDB. + + DoltDB is a SQL database with Git-like version control for data and schema. + It is fully MySQL-compatible. + """ + + engine = "doltdb" + engine_name = "DoltDB" + + metadata = { + "description": ( + "DoltDB is a SQL database with Git-like version control for data " + "and schema. It is fully MySQL-compatible." + ), + "logo": "doltdb.png", + "homepage_url": "https://www.dolthub.com/", + "categories": [ + DatabaseCategory.TRADITIONAL_RDBMS, + DatabaseCategory.OPEN_SOURCE, + ], + "pypi_packages": ["mysqlclient"], + "connection_string": "mysql://{username}:{password}@{host}:{port}/{database}", + "default_port": 3306, + "notes": ( + "DoltDB uses the MySQL wire protocol. Connect using any MySQL driver." + ), + } diff --git a/superset/db_engine_specs/mssql.py b/superset/db_engine_specs/mssql.py index 3a8bdfa8dbe..dc47a92c770 100644 --- a/superset/db_engine_specs/mssql.py +++ b/superset/db_engine_specs/mssql.py @@ -57,7 +57,7 @@ class MssqlEngineSpec(BaseEngineSpec): "description": ( "Microsoft SQL Server is a relational database management system." ), - "logo": "msql.png", + "logo": "mssql-server.png", "homepage_url": "https://www.microsoft.com/en-us/sql-server", "categories": [ DatabaseCategory.TRADITIONAL_RDBMS, diff --git a/superset/db_engine_specs/postgis.py b/superset/db_engine_specs/postgis.py new file mode 100644 index 00000000000..c02b95cd82c --- /dev/null +++ b/superset/db_engine_specs/postgis.py @@ -0,0 +1,53 @@ +# 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 superset.db_engine_specs.base import DatabaseCategory +from superset.db_engine_specs.postgres import PostgresBaseEngineSpec + + +class PostGISEngineSpec(PostgresBaseEngineSpec): + """ + Engine spec for PostGIS. + + PostGIS is a spatial database extender for PostgreSQL, adding support for + geographic objects and location queries. + """ + + engine = "postgis" + engine_name = "PostGIS" + default_driver = "psycopg2" + + metadata = { + "description": ( + "PostGIS is a spatial database extender for PostgreSQL, adding " + "support for geographic objects and location queries." + ), + "logo": "postgis.svg", + "homepage_url": "https://postgis.net/", + "categories": [ + DatabaseCategory.TRADITIONAL_RDBMS, + DatabaseCategory.OPEN_SOURCE, + ], + "pypi_packages": ["psycopg2"], + "connection_string": ( + "postgresql://{username}:{password}@{host}:{port}/{database}" + ), + "default_port": 5432, + "notes": ( + "PostGIS extends PostgreSQL with geospatial capabilities. " + "Uses the standard PostgreSQL driver." + ), + } diff --git a/superset/db_engine_specs/questdb.py b/superset/db_engine_specs/questdb.py new file mode 100644 index 00000000000..ae7a6f492c3 --- /dev/null +++ b/superset/db_engine_specs/questdb.py @@ -0,0 +1,62 @@ +# 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 superset.constants import TimeGrain +from superset.db_engine_specs.base import BaseEngineSpec, DatabaseCategory + + +class QuestDBEngineSpec(BaseEngineSpec): + """ + Engine spec for QuestDB. + + QuestDB is a high-performance, open-source time-series database optimized + for fast ingest and SQL queries. + """ + + engine = "questdb" + engine_name = "QuestDB" + default_driver = "questdb" + + metadata = { + "description": ( + "QuestDB is a high-performance, open-source time-series database " + "optimized for fast ingest and SQL queries." + ), + "logo": "questdb.png", + "homepage_url": "https://questdb.io/", + "categories": [ + DatabaseCategory.ANALYTICAL_DATABASES, + DatabaseCategory.OPEN_SOURCE, + ], + "pypi_packages": ["questdb-connect"], + "connection_string": "questdb://{username}:{password}@{host}:{port}/{database}", + "default_port": 8812, + "notes": ( + "QuestDB is optimized for time-series data. Install questdb-connect " + "for SQLAlchemy support." + ), + } + + _time_grain_expressions = { + None: "{col}", + TimeGrain.SECOND: "timestamp_floor('s', {col})", + TimeGrain.MINUTE: "timestamp_floor('m', {col})", + TimeGrain.HOUR: "timestamp_floor('h', {col})", + TimeGrain.DAY: "timestamp_floor('d', {col})", + TimeGrain.WEEK: "timestamp_floor('w', {col})", + TimeGrain.MONTH: "timestamp_floor('M', {col})", + TimeGrain.YEAR: "timestamp_floor('y', {col})", + } diff --git a/superset/db_engine_specs/tidb.py b/superset/db_engine_specs/tidb.py new file mode 100644 index 00000000000..e913640d0eb --- /dev/null +++ b/superset/db_engine_specs/tidb.py @@ -0,0 +1,74 @@ +# 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 superset.db_engine_specs.base import DatabaseCategory +from superset.db_engine_specs.mysql import MySQLEngineSpec + + +class TiDBEngineSpec(MySQLEngineSpec): + """ + Engine spec for TiDB. + + TiDB is an open-source, cloud-native, distributed SQL database designed for + hybrid transactional and analytical processing (HTAP) workloads. It is + MySQL-compatible. + """ + + engine = "tidb" + engine_name = "TiDB" + + metadata = { + "description": ( + "TiDB is an open-source, cloud-native, distributed SQL database " + "designed for hybrid transactional and analytical processing (HTAP) " + "workloads. It is MySQL-compatible." + ), + "logo": "tidb.svg", + "homepage_url": "https://www.pingcap.com/tidb/", + "categories": [ + DatabaseCategory.TRADITIONAL_RDBMS, + DatabaseCategory.OPEN_SOURCE, + ], + "pypi_packages": ["mysqlclient", "sqlalchemy-tidb"], + "connection_string": "mysql://{username}:{password}@{host}:{port}/{database}", + "default_port": 4000, + "drivers": [ + { + "name": "mysqlclient", + "pypi_package": "mysqlclient", + "connection_string": ( + "mysql://{username}:{password}@{host}:{port}/{database}" + ), + "is_recommended": True, + "notes": ( + "Standard MySQL driver, works with TiDB's MySQL compatibility." + ), + }, + { + "name": "tidb", + "pypi_package": "sqlalchemy-tidb", + "connection_string": ( + "tidb://{username}:{password}@{host}:{port}/{database}" + ), + "is_recommended": False, + "notes": "Native TiDB dialect with TiDB-specific optimizations.", + }, + ], + "notes": ( + "TiDB is MySQL-compatible. Use the standard MySQL driver or the " + "native sqlalchemy-tidb dialect." + ), + } diff --git a/superset/db_engine_specs/timeplus.py b/superset/db_engine_specs/timeplus.py new file mode 100644 index 00000000000..4aea3e29b3b --- /dev/null +++ b/superset/db_engine_specs/timeplus.py @@ -0,0 +1,63 @@ +# 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 superset.constants import TimeGrain +from superset.db_engine_specs.base import BaseEngineSpec, DatabaseCategory + + +class TimeplusEngineSpec(BaseEngineSpec): + """ + Engine spec for Timeplus. + + Timeplus is a streaming-first analytics platform that provides real-time + data processing with SQL. + """ + + engine = "timeplus" + engine_name = "Timeplus" + default_driver = "timeplus" + + metadata = { + "description": ( + "Timeplus is a streaming-first analytics platform that provides " + "real-time data processing with SQL." + ), + "logo": "timeplus.svg", + "homepage_url": "https://www.timeplus.com/", + "categories": [ + DatabaseCategory.ANALYTICAL_DATABASES, + DatabaseCategory.OPEN_SOURCE, + ], + "pypi_packages": ["timeplus-connect"], + "connection_string": "timeplus://{username}:{password}@{host}:{port}", + "default_port": 8123, + "notes": ( + "Timeplus provides real-time streaming SQL analytics. Install " + "timeplus-connect for SQLAlchemy and Superset support." + ), + } + + _time_grain_expressions = { + None: "{col}", + TimeGrain.SECOND: "date_trunc('second', {col})", + TimeGrain.MINUTE: "date_trunc('minute', {col})", + TimeGrain.HOUR: "date_trunc('hour', {col})", + TimeGrain.DAY: "date_trunc('day', {col})", + TimeGrain.WEEK: "date_trunc('week', {col})", + TimeGrain.MONTH: "date_trunc('month', {col})", + TimeGrain.QUARTER: "date_trunc('quarter', {col})", + TimeGrain.YEAR: "date_trunc('year', {col})", + }
