第三方集成问题
优质
小牛编辑
129浏览
2023-12-01
我得到的错误与“数字.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()