Third Party Integration Issues — SQLAlchemy 1.4 Documentation

Release: 1.4.48 | Release Date: April 30, 2023

# SQLAlchemy 1.4 Documentation

# Third Party Integration Issues

## I’m getting errors related to “`numpy.int64`”, “`numpy.bool_`”, etc.

The numpy package has its own numeric datatypes that extend from Python’s numeric types, but contain some behaviors that in some cases make them impossible to reconcile with some of SQLAlchemy’s behaviors, as well as in some cases with those of the underlying DBAPI driver in use.

Two errors which can occur are `ProgrammingError: can't adapt type 'numpy.int64'` on a backend such as psycopg2, and `ArgumentError: SQL expression object expected, got object of type <class 'numpy.bool_'> instead`; in more recent versions of SQLAlchemy this may be `ArgumentError: SQL expression for WHERE/HAVING role expected, got True`.

In the first case, the issue is due to psycopg2 not having an appropriate lookup entry for the `int64` datatype such that it is not accepted directly by queries. This may be illustrated from code based on the following:

    import numpy

    class A(Base):
        __tablename__ = "a"

        id = Column(Integer, primary_key=True)
        data = Column(Integer)

    # .. later
    session.add(A(data=numpy.int64(10)))
    session.commit()

In the latter case, the issue is due to the `numpy.int64` datatype overriding the `__eq__()` method and enforcing that the return type of an expression is `numpy.True` or `numpy.False`, which breaks SQLAlchemy’s expression language behavior that expects to return `ColumnElement` expressions from Python equality comparisons:

    >>> import numpy
    >>> from sqlalchemy import column, Integer
    >>> print(column("x", Integer) == numpy.int64(10))  # works
    x = :x_1
    >>> print(numpy.int64(10) == column("x", Integer))  # breaks
    False

These errors are both solved in the same way, which is that special numpy datatypes need to be replaced with regular Python values. Examples include applying the Python `int()` function to types like `numpy.int32` and `numpy.int64` and the Python `float()` function to `numpy.float32`:

    data = numpy.int64(10)

    session.add(A(data=int(data)))

    result = session.execute(select(A.data).where(int(data) == A.data))

    session.commit()

## SQL expression for WHERE/HAVING role expected, got True

See I’m getting errors related to “numpy.int64”, “numpy.bool_”, etc..