第三方集成问题¶
我收到了与 “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
这些错误都以相同的方式解决,即需要用常规 Python 值替换特殊的 numpy 数据类型。示例包括将 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()