第三方集成问题¶
我收到了与 “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()