Проблемы интеграции со сторонними организациями¶
Я получаю ошибки, связанные с «numpy.int64
», «numpy.bool_
» и т.д.¶
Пакет numpy имеет свои собственные числовые типы данных, которые расширяют числовые типы Python, но содержат некоторые поведения, которые в некоторых случаях делают невозможным их согласование с некоторыми поведениями SQLAlchemy, а также в некоторых случаях с поведениями используемого драйвера DBAPI.
Две ошибки, которые могут возникнуть, это ProgrammingError: can't adapt type 'numpy.int64'
на бэкенде, таком как psycopg2, и ArgumentError: SQL expression object expected, got object of type <class 'numpy.bool_'> instead
; в более новых версиях SQLAlchemy это может быть ArgumentError: SQL expression for WHERE/HAVING role expected, got True
.
В первом случае проблема связана с тем, что в psycopg2 нет соответствующей записи поиска для типа данных int64
, поэтому он не принимается непосредственно запросами. Это можно проиллюстрировать на примере следующего кода:
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()
В последнем случае проблема связана с тем, что тип данных numpy.int64
переопределяет метод __eq__()
и заставляет возвращать тип выражения numpy.True
или numpy.False
, что нарушает поведение языка выражений SQLAlchemy, который ожидает возврата выражений ColumnElement
от сравнений равенства в Python:
>>> 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
Обе эти ошибки решаются одинаково, то есть специальные типы данных numpy нужно заменить на обычные значения Python. Примеры включают применение функции Python int()
к типам numpy.int32
и numpy.int64
и функции Python float()
к 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-выражение для роли WHERE/HAVING, получено True¶
См. Я получаю ошибки, связанные с «numpy.int64», «numpy.bool_» и т.д..
SQLAlchemy 1.4
Содержание
Дополнительно
Вы здесь:
-
Документация Django SQLAlchemy 1.4
- Часто задаваемые вопросы
- Проблемы интеграции со сторонними организациями
- Часто задаваемые вопросы