Skip to content

Releases: exasol/sqlalchemy-exasol

6.0.0

08 Dec 12:21
6d0318f

Choose a tag to compare

6.0.0 - 2025-12-08

In this major release, sqlachemy-exasol has been migrated to the SQLAlchemy 2.0 API
and conventions. The focus of the migration was preserving existing feature parity.
Thus, new features added in the SQLAlchemy 2.0 API may not work as expected.
If such features are important to your team or if you experience other issues, please open
an issue. Note that this migration
is a breaking change and action will need to be taken by your team to make
your code compatible with sqlalchemy-exasol==6.0.0.

The migration to SQLAlchemy 2.0 allows users to benefit from continued security support, performance
improvements, modern typing support, and additional features. For details
on what SQLAlchemy 2.0 brings and which changes are needed in your projects, please
check out the following links:

Additionally, the ODBC-based dialects pyodbc and Turbodbc, which had been marked as
deprecated, were dropped. Please switch over to using the websocket dialect.
Connection strings should be altered to start with exa+websocket://.

Refactoring

  • #621: Added future=true to create_engine to use the 2.0 API
  • #623: Started switch to sqlalchemy 2.x (CI tested with 2.0.43)
    • All unit, exasol, and regression tests are working
    • Several tests from sqlalchemy are failing, have been marked as skipped, and require investigation
    • Reinstated the ArgSignatureTest which ensures that all visit_XYZ() in _sql.Compiler subclasses have **kw
  • #626: Reinstated sqlalchemy tests:
    • TrueDivTest.test_floordiv_integer and TrueDivTest.test_floordiv_integer_bound by providing an override in EXACompiler.visit_floordiv_binary
    • TrueDivTest.test_truediv_numeric by providing ExaDecimal to the EXADialect_pyodbc.colspecs list
    • a few tests from ComponentReflectionTest as define_reflected_tables is overridden based on what Exasol supports
  • #631: Updated EXADialect.has_table to search for both tables and views, fixed passing of schema=None to dialect methods, and reinstated sqlalchemy tests:
    • ReturningGuardsTest are used to indicate that the Exasol dialect, which does not natively support the RETURNING clause, is set up per the API specifications
    • ComponentReflectionTest.test_not_existing_table is used to indicate that specific EXADialect methods (i.e. get_columns) check to see if the requested table/view exists and if not, they will now toss a NoSuchTableError exception
  • #403: Dropped support for Turbodbc
  • #404: Dropped support for pyodbc
  • #654: Reinstated sqlalchemy tests after minor modifications to work for Exasol:
    • ComponentReflectionTest.test_get_multi_columns
    • ComponentReflectionTest.test_get_multi_foreign_keys
    • ComponentReflectionTest.test_get_multi_pk_constraint
    • ComponentReflectionTest.test_get_view_definition_does_not_exist
  • #652: Reinstated sqlalchemy tests after minor modifications to work for Exasol:
    • HasTableTest.test_has_table_cache
    • RowCountTest.test_non_rowcount_scenarios_no_raise
  • #658: Updated to exasol-toolbox 3.0.0

Documentation

  • #660: Updated User Guide
    • Added Getting Started, Security, & Engine Configuration pages
    • Cleaned up index and README.rst
  • #663: Updated developer documentation
  • #653: Updated User Guide for accessing Exasol SaaS instances.

Dependency Updates

main

  • Updated dependency pyexasol:1.2.1 to 1.3.0
  • Removed dependency pyodbc:5.3.0
  • Updated dependency sqlalchemy:1.4.54 to 2.0.44
  • Removed dependency turbodbc:4.5.4

dev

  • Updated dependency exasol-integration-test-docker-environment:4.3.0 to 4.4.1
  • Updated dependency exasol-toolbox:1.12.0 to 3.0.0
  • Updated dependency nox:2025.10.16 to 2025.11.12
  • Removed dependency pyodbc:5.3.0

5.2.0

04 Nov 15:01
6e22f20

Choose a tag to compare

5.2.0 - 2025-11-04

This release drops the support for Python 3.9 as this Python version has reached its end-of-life in 2025-10. In consequence, the release also fixes security vulnerabilities by updating the dependencies.

With this release, in the Websocket-based dialect, it is possible for users to pass FINGERPRINT into
the connection URL to take advantage of an additional security feature in PyExasol version
1.x.

from sqlalchemy import create_engine
    url = "exa+websocket://A_USER:[email protected]:1234/my_schema?FINGERPRINT=C70EB4DC0F62A3BF8FD7FF22D2EB2C489834958212AC12C867459AB86BE3A028"
    engine = create_engine(url)
    query = "select 42 from dual"
    with engine.connect() as con:
        result = con.execute(sql.text(query)).fetchall()

Feature

  • #612: Updated CI tests to run against Exasol DB versions 7.1.30, 8.34.0, and 2025.1.0. Dropped support for Python 3.9.
  • #637: Added option to exa-websocket (Websocket-based dialect) to pass FINGERPRINT in the connection URL for additional security

Refactoring

  • #610: Altered string input into Connection.execute() to be handled properly with sql.text()
  • #614: Altered params input into Connection.execute() to be handled properly with dict
  • #616: Altered usage of MetaData which was binding to a connection to instead bind in the needed object or function
  • #617: Enacted warning for the deprecation of the autoload parameter and requirement of bind
  • #618: Switched DML & DDL executions from engine.connect() to engine.begin() usage
  • #637: Updated dependency declaration to pyexasol

Internal

  • #558: Updated to poetry 2.1.2 & relocked dependencies to resolve CVE-2025-27516
  • #548: Replaced pytest-exasol-itde with pytest-backend
  • Relocked dependencies to resolve CVE-2025-43859
  • #564: Replaced nox test:unit with that from exasol-toolbox
  • Reformatted files to meet project specifications
  • #588: Updated to exasol-toolbox 1.6.0 and relocked dependencies to resolve CVE-2025-50182, CVE-2025-50181, & CVE-2024-47081
  • #605: Removed non-ASCII unicode from templates & relocked dependencies to resolve CVE-2025-8869 (pip -> transitive dependency)
  • #640: Re-locked dependencies to resolve CVE-2025-8869 for transitive dependency pip

Dependency Updates

main

  • Updated dependency packaging:24.2 to 25.0
  • Updated dependency pyexasol:0.27.0 to 1.2.1
  • Updated dependency pyodbc:5.2.0 to 5.3.0

dev

  • Removed dependency black:25.1.0
  • Updated dependency exasol-integration-test-docker-environment:3.4.0 to 4.3.0
  • Updated dependency exasol-toolbox:0.20.0 to 1.12.0
  • Removed dependency furo:2024.8.6
  • Removed dependency isort:5.13.2
  • Removed dependency mypy:1.15.0
  • Updated dependency nox:2025.2.9 to 2025.10.16
  • Removed dependency pre-commit:4.1.0
  • Removed dependency pylint:3.3.4
  • Updated dependency pyodbc:5.2.0 to 5.3.0
  • Removed dependency pytest-cov:6.0.0
  • Added dependency pytest-exasol-backend:1.2.2
  • Removed dependency pytest-exasol-itde:0.2.1
  • Removed dependency pytest-history:0.3.0
  • Removed dependency pyupgrade:3.19.1
  • Removed dependency sphinx:7.4.7
  • Removed dependency sphinx-copybutton:0.5.2
  • Removed dependency urlscan:1.0.6

5.1.0

14 Feb 15:47
ea1a4fe

Choose a tag to compare

5.1.0 — 2025-02-14

🗑️ Removed

  • Dropped python 3.8 support
    • If you still depend on python 3.8 use the 5.x version line

🧰 Internal

  • Relocked dependencies
  • Removed pyexasol dbapi2 api shim
    (Now it is using the dbapi2 shim provided by the pyexasol project)
  • Remove testing against Exasol 7.0

📚 Documentation

  • Added support for multiversion documentation

5.0.0

02 Feb 08:11
0e8cda4

Choose a tag to compare

5.0.0 — 2024-02-02

🔧 Changed

  • Made pyodbc an optional dependency
  • Made websockets the default way to use sqlalchemy with exasol
  • Added deprecation warnings for pyodbc and trubodbc dialects

🧰 Internal

  • Relocked dependencies

4.6.3

21 Dec 08:03
2308a5a

Choose a tag to compare

4.6.3 — 2023-12-21

🔧 Changed

  • Changed pyodbc upper bound constraint
    (Allow larger upper bounds)

🧰 Internal

  • Relocked dependencies
  • Bumped versions of GitHub actions
  • Adjusted workflow triggers, to enable workflow runs for external branches

4.6.2

22 Nov 15:31
dfc5a55

Choose a tag to compare

4.6.2 — 2023-11-22

🔧 Changed

  • Loosened the SQLAlchemy dependency constraint to >=1.4,<2

4.6.1

06 Nov 07:36
cc513aa

Choose a tag to compare

4.6.0

18 Jul 09:18
f7be0ea

Choose a tag to compare

4.6.0 — 2023-07-18

✨ Features

  • Websocket based dialect have been stabilized and is officially supported now
    • 📘 Note: Inserting multiple empty row's, facilitating default settings currently isn't supported

🐞 Fixed

  • Fixed "prepared statements send the wrong types as parameters to the server" #341
  • Fixed "various SQLA compliance tests are failing for the websocket based dialect" #342

4.5.1

25 May 12:02
674a3e7

Choose a tag to compare

4.5.1 — 2023-05-25

🐞 Fixed

  • Fixed missing websocket driver package in release deliverables

4.5.0

24 May 13:07
1109c86

Choose a tag to compare

4.5.0 — 2023-05-24

  • Added Beta version of websocket based dialect

    🚨 Attention:

    This feature is currently in Beta, therefore it should not be used in production.
    We also recommend to have a look into the known issues, before you start using it.

    If you encounter any problem, please create an issue.
    With your feedback, we will be able stabilize this feature more quickly.