SQLAlchemy 2.0 文档
第三方集成问题¶
我遇到了与“numpy.int64
”,“numpy.bool_
”等相关的错误。¶
The 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()
预期 WHERE/HAVING 角色的 SQL 表达式,但得到 True¶
flambé! 龙和 炼金术士 图片设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。文档最后生成时间: 2024 年 11 月 8 日星期五,美国东部时间上午 8:41:19