diff --git a/duckdb_engine/__init__.py b/duckdb_engine/__init__.py index cf145a17..734e625a 100644 --- a/duckdb_engine/__init__.py +++ b/duckdb_engine/__init__.py @@ -159,6 +159,7 @@ class Dialect(PGDialect_psycopg2): # postgres type_codes (such as 701 for float) that duckdb doesn't have sqltypes.Numeric: sqltypes.Numeric, sqltypes.Interval: sqltypes.Interval, + sqltypes.JSON: sqltypes.JSON, }, ) diff --git a/duckdb_engine/tests/test_datatypes.py b/duckdb_engine/tests/test_datatypes.py index 04aa79b5..41685831 100644 --- a/duckdb_engine/tests/test_datatypes.py +++ b/duckdb_engine/tests/test_datatypes.py @@ -1,10 +1,11 @@ from typing import Type from pytest import mark -from sqlalchemy import Column, Integer +from sqlalchemy import Column, Integer, select from sqlalchemy.engine import Engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session +from sqlalchemy.types import JSON from ..datatypes import types @@ -32,3 +33,22 @@ def test_unsigned_integer_type( session.commit() assert session.query(table).one() + + +def test_json(engine: Engine, session: Session) -> None: + base = declarative_base() + + class Entry(base): + __tablename__ = "test_json" + + id = Column(Integer, primary_key=True, default=0) + meta = Column(JSON, nullable=False) + + base.metadata.create_all(bind=engine) + + session.add(Entry(meta={"hello": "world"})) # type: ignore[call-arg] + session.commit() + + result = session.scalar(select(Entry)) + + assert result.meta == {"hello": "world"}