SQLAlchemy 2.0 Dokumentation
Häufig gestellte Fragen
- Installation
- Verbindungen / Engines
- MetaData / Schema
- SQL-Ausdrücke
- ORM-Konfiguration
- Performance
- Sessions / Abfragen
- Probleme mit der Integration von Drittanbietern¶
Projektversionen
Probleme mit der Integration von Drittanbietern¶
Ich erhalte Fehler im Zusammenhang mit "numpy.int64", "numpy.bool_" usw.¶
Das Numpy-Paket hat seine eigenen numerischen Datentypen, die von den numerischen Typen von Python abgeleitet sind, aber einige Verhaltensweisen aufweisen, die in einigen Fällen eine Vereinbarkeit mit einigen Verhaltensweisen von SQLAlchemy sowie in einigen Fällen mit denen des zugrunde liegenden DBAPI-Treibers erschweren.
Zwei Fehler, die auftreten können, sind ProgrammingError: can't adapt type 'numpy.int64' auf einem Backend wie psycopg2 und ArgumentError: SQL expression object expected, got object of type <class 'numpy.bool_'> instead; in neueren Versionen von SQLAlchemy kann dies sein ArgumentError: SQL expression for WHERE/HAVING role expected, got True.
Im ersten Fall liegt das Problem daran, dass psycopg2 keinen geeigneten Lookup-Eintrag für den Datentyp int64 hat, so dass er von Abfragen nicht direkt akzeptiert wird. Dies kann durch Code basierend auf dem folgenden veranschaulicht werden
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()Im letzteren Fall liegt das Problem daran, dass der Datentyp numpy.int64 die Methode __eq__() überschreibt und erzwingt, dass der Rückgabetyp eines Ausdrucks numpy.True oder numpy.False ist, was das Verhalten der Ausdruckssprache von SQLAlchemy unterbricht, das erwartet, dass ColumnElement-Ausdrücke aus Python-Gleichheitsvergleichen zurückgegeben werden
>>> 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
FalseDiese Fehler werden beide auf die gleiche Weise gelöst, nämlich dass spezielle Numpy-Datentypen durch reguläre Python-Werte ersetzt werden müssen. Beispiele hierfür sind die Anwendung der Python-Funktion int() auf Typen wie numpy.int32 und numpy.int64 und die Python-Funktion float() auf 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-Ausdruck für die Rolle WHERE/HAVING erwartet, erhielt True¶
Siehe Ich erhalte Fehler im Zusammenhang mit "numpy.int64", "numpy.bool_", etc..
Die Designs von flambé! dem Drachen und Der Alchemist wurden von Rotem Yaari erstellt und großzügig gespendet.
Erstellt mit Sphinx 7.2.6. Dokumentation zuletzt generiert: Di 11 Mär 2025 14:40:17 EDT