From fe6aa56b3a76af796472ac5148b8c6f7b017fb0b Mon Sep 17 00:00:00 2001 From: Diaa Eddin Date: Tue, 27 Jan 2026 12:20:35 +0400 Subject: [PATCH] Add SQLAlchemy 2.0 support SQLAlchemy 2.0 unified the execute() API - Connection.execute() no longer accepts **kwargs, requiring parameters as a dict instead. Uses packaging library for robust version detection. --- jsql/__init__.py | 9 +++++++++ setup.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/jsql/__init__.py b/jsql/__init__.py index b103431..ad9870b 100644 --- a/jsql/__init__.py +++ b/jsql/__init__.py @@ -6,6 +6,10 @@ import logging import six import itertools, collections +import sqlalchemy +from packaging import version + +_SA_VERSION = version.parse(sqlalchemy.__version__) class UnsafeSqlException(Exception): pass @@ -81,7 +85,12 @@ def dangerously_inject_sql(value): def execute_sql(engine, query, params): from sqlalchemy.sql import text + from sqlalchemy.engine import Engine q = text(query) + if _SA_VERSION.major >= 2: + if isinstance(engine, Engine): + raise TypeError("SQLAlchemy 2.0 removed Engine.execute(). Pass a Connection instead.") + return engine.execute(q, params) is_session = 'session' in repr(engine.__class__).lower() return engine.execute(q, params=params) if is_session else engine.execute(q, **params) diff --git a/setup.py b/setup.py index ba7e5d6..d0acf3f 100644 --- a/setup.py +++ b/setup.py @@ -7,8 +7,8 @@ author_email='hzarka@gmail.com', packages = find_packages(), package_dir = {'': '.'}, - requires = ["six"], - install_requires = ["six"], + requires = ["six", "packaging"], + install_requires = ["six", "packaging"], classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Web Environment',