数字.int64
", "努比·布尔_
“,等等。¶这个 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()
flambé! the dragon and The Alchemist image designs created and generously donated by Rotem Yaari.
Created using Sphinx 4.2.0.