第三方集成问题

优质
小牛编辑
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.Truenumpy.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.int32numpy.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

我得到的错误与“数字.int64", "努比·布尔_“,等等。 .