Third Party Integration Issues¶
I’m getting errors related to “numpy.int64
”, “numpy.bool_
”, etc.¶
numpy_packageには、Pythonの数値型から拡張された独自の数値データ型がありますが、いくつかの動作が含まれているため、SQLAlchemyの動作の一部と一致させることができない場合や、使用中の基礎となるDBAPIドライバの動作と一致させることができない場合があります。
発生する可能性のある2つのエラーは、psycopg2などのバックエンドで発生する ProgrammingError:can't adapt type'numpy.int64'
、および ArgumentError:SQL expression object expected, got object of typ e<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
であることを強制することに起因しています。これは、Pythonの等価性比較から ColumnElement
式を返すことを期待するSQLAlchemyの式言語の動作を破壊します。
>>> 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 expression for WHERE/HAVING role expected, got True¶
I’m getting errors related to “numpy.int64”, “numpy.bool_”, etc. を参照してください。