From 5df1091fbe25cb3ed1f89c3f9d11f9943168148d Mon Sep 17 00:00:00 2001 From: Adrien Rambert Date: Wed, 7 Jan 2026 15:41:02 +0100 Subject: [PATCH 1/4] Add type: DOUBLE (float8) --- .gitignore | 1 + duckdb_engine/datatypes.py | 7 ++++++- duckdb_engine/tests/test_datatypes.py | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ee84b1fd3..38b401b58 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ coverage.xml .vscode results.xml venv +.venv diff --git a/duckdb_engine/datatypes.py b/duckdb_engine/datatypes.py index 363f6e878..b8fcc8957 100644 --- a/duckdb_engine/datatypes.py +++ b/duckdb_engine/datatypes.py @@ -13,6 +13,7 @@ import duckdb from packaging.version import Version from sqlalchemy import exc +import sqlalchemy from sqlalchemy.dialects.postgresql.base import PGIdentifierPreparer, PGTypeCompiler from sqlalchemy.engine import Dialect from sqlalchemy.ext.compiler import compiles @@ -26,8 +27,10 @@ (BigInteger, SmallInteger) # pure reexport duckdb_version = duckdb.__version__ +sqlalchemy_version = sqlalchemy.__version__ IS_GT_1 = Version(duckdb_version) > Version("1.0.0") +IS_SQLA_GT_2 = Version(sqlalchemy_version) > Version("2.0.0") class UInt64(Integer): @@ -206,7 +209,6 @@ def __init__(self, fields: Dict[str, TV]): "timetz": sqltypes.TIME, "timestamptz": sqltypes.TIMESTAMP, "float4": sqltypes.FLOAT, - "float8": sqltypes.FLOAT, "usmallint": USmallInteger, "uinteger": UInteger, "ubigint": UBigInteger, @@ -219,6 +221,9 @@ def __init__(self, fields: Dict[str, TV]): } if IS_GT_1: ISCHEMA_NAMES["varint"] = VarInt +if IS_SQLA_GT_2: + ISCHEMA_NAMES["float8"] = sqltypes.DOUBLE + ISCHEMA_NAMES["double"] = sqltypes.DOUBLE def register_extension_types() -> None: diff --git a/duckdb_engine/tests/test_datatypes.py b/duckdb_engine/tests/test_datatypes.py index 6149fcfe9..a8596627e 100644 --- a/duckdb_engine/tests/test_datatypes.py +++ b/duckdb_engine/tests/test_datatypes.py @@ -166,6 +166,25 @@ def test_double_in_sqla_v2(engine: Engine) -> None: with engine.begin() as con: con.execute(t.select()) +def test_double(engine: Engine, session: Session) -> None: + sqlalchemy = importorskip("sqlalchemy", "2.0.0") + base = declarative_base() + + class Entry(base): + __tablename__ = "test_double" + + id = Column(Integer, primary_key=True, default=0) + value = Column(sqlalchemy.DOUBLE, nullable=False) + + base.metadata.create_all(bind=engine) + + session.add(Entry(value=42.000001)) # type: ignore[call-arg] + session.commit() + + result = session.query(Entry).one() + + assert result.value == 42.000001 + def test_all_types_reflection(engine: Engine) -> None: importorskip("sqlalchemy", "1.4.0") From 45489ed1235c7ca5ea99b3abcfe04dc2229a5ca0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 14:43:30 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- duckdb_engine/datatypes.py | 2 +- duckdb_engine/tests/test_datatypes.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/duckdb_engine/datatypes.py b/duckdb_engine/datatypes.py index b8fcc8957..7d47721d4 100644 --- a/duckdb_engine/datatypes.py +++ b/duckdb_engine/datatypes.py @@ -11,9 +11,9 @@ from typing import Any, Callable, Dict, Optional, Type import duckdb +import sqlalchemy from packaging.version import Version from sqlalchemy import exc -import sqlalchemy from sqlalchemy.dialects.postgresql.base import PGIdentifierPreparer, PGTypeCompiler from sqlalchemy.engine import Dialect from sqlalchemy.ext.compiler import compiles diff --git a/duckdb_engine/tests/test_datatypes.py b/duckdb_engine/tests/test_datatypes.py index a8596627e..af27596ad 100644 --- a/duckdb_engine/tests/test_datatypes.py +++ b/duckdb_engine/tests/test_datatypes.py @@ -166,6 +166,7 @@ def test_double_in_sqla_v2(engine: Engine) -> None: with engine.begin() as con: con.execute(t.select()) + def test_double(engine: Engine, session: Session) -> None: sqlalchemy = importorskip("sqlalchemy", "2.0.0") base = declarative_base() From 3f5a86dce9b57a955409bfca7fe7066985a9db92 Mon Sep 17 00:00:00 2001 From: Adrien Rambert Date: Wed, 7 Jan 2026 16:13:14 +0100 Subject: [PATCH 3/4] ignore mypy failure under if condition --- duckdb_engine/datatypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/duckdb_engine/datatypes.py b/duckdb_engine/datatypes.py index 7d47721d4..fc07f3b2d 100644 --- a/duckdb_engine/datatypes.py +++ b/duckdb_engine/datatypes.py @@ -222,8 +222,8 @@ def __init__(self, fields: Dict[str, TV]): if IS_GT_1: ISCHEMA_NAMES["varint"] = VarInt if IS_SQLA_GT_2: - ISCHEMA_NAMES["float8"] = sqltypes.DOUBLE - ISCHEMA_NAMES["double"] = sqltypes.DOUBLE + ISCHEMA_NAMES["float8"] = sqltypes.DOUBLE # type: ignore[attr-defined] + ISCHEMA_NAMES["double"] = sqltypes.DOUBLE # type: ignore[attr-defined] def register_extension_types() -> None: From f6636a0992d334788c0cd8e18ef1b9176f0055b4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 15:13:27 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- duckdb_engine/datatypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/duckdb_engine/datatypes.py b/duckdb_engine/datatypes.py index fc07f3b2d..30f22652e 100644 --- a/duckdb_engine/datatypes.py +++ b/duckdb_engine/datatypes.py @@ -222,8 +222,8 @@ def __init__(self, fields: Dict[str, TV]): if IS_GT_1: ISCHEMA_NAMES["varint"] = VarInt if IS_SQLA_GT_2: - ISCHEMA_NAMES["float8"] = sqltypes.DOUBLE # type: ignore[attr-defined] - ISCHEMA_NAMES["double"] = sqltypes.DOUBLE # type: ignore[attr-defined] + ISCHEMA_NAMES["float8"] = sqltypes.DOUBLE # type: ignore[attr-defined] + ISCHEMA_NAMES["double"] = sqltypes.DOUBLE # type: ignore[attr-defined] def register_extension_types() -> None: