SQLAlchemy 2.0 文档
第三方集成问题¶
我遇到了与 “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 表达式语言的行为,该行为期望从 Python 相等比较返回 ColumnElement
表达式
>>> 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¶
flambé! 龙和 炼金术士 图像设计由 Rotem Yaari 创作并慷慨捐赠。
使用 Sphinx 7.2.6 创建。 文档最后生成时间:美国东部夏令时间 2025年3月11日 02:40:17 下午