Lassen Sie mich zuerst erklären, warum das, was Sie versucht haben, nicht funktioniert. SQLAlchemy ist nur eine bequeme Möglichkeit, SQL-Abfragen zu schreiben, die Abfrage erfolgt dennoch auf der Remote-Seite. SQLAlchemy-Spalten sind spezielle Objekte, deren __eq__
, usw. Methoden überschrieben werden, um nicht True
oder False
zurückzugeben, sondern andere spezielle Objekte, die sich daran erinnern, mit welchem Objekt sie verglichen wurden und später entsprechende SQL-Anweisungen generieren können. Dasselbe gilt für das Hinzufügen von etc: Die benutzerdefinierte Methode __add__
, __sub__
gibt keine Zahl oder eine verkettete Zeichenfolge zurück, sondern auch ein solches Objekt, das eine SQL-Anweisung generiert. Sie können sie zu Zeichenketten, Ganzzahlen usw., anderen Spalten, SELECT-Anweisungen, mysql-Funktionsaufrufen usw., , aber nicht zu speziellen Python-Objekten wie z. B. timedeltas vergleichen/hinzufügen. (vereinfachte, und wahrscheinlich technisch nicht 100% richtig;))
Also, was können Sie tun, ist:
- die Werte in der Datenbank ganzen Zahlen Stellen, zB Unix-Zeitstempel. Auf diese Weise funktioniert Ihre
between
Abfrage (mit anstelle des Deltas)
- Verwenden Sie Datenbank-Side-Funktionen, um das Datetime-Format-Datum in einen Unix-Zeitstempel zu konvertieren, und führen Sie dann den Vergleich.
UPDATE: Ich habe mit, dass rund ein wenig gespielt, und irgendwie es funktioniert, gibt es auch einen Interval
Datentyp. Doch zumindest hier funktioniert es nicht richtig:
MySQL:
>>> db.session.execute(db.select([User.date_joined, User.date_joined + timedelta(seconds=2)], limit=1)).fetchall()
[(datetime.datetime(2009, 7, 10, 20, 47, 33), 20090710204733.0)]
>>> db.session.execute(db.select([User.date_joined, User.date_joined + 2], limit=1)).fetchall()
[(datetime.datetime(2009, 7, 10, 20, 47, 33), 20090710204735.0)]
>>> db.session.execute(db.select([User.date_joined+0, User.date_joined + 2], limit=1)).fetchall()
[(20090710204733.0, 20090710204735.0)]
SQLite:
>>> db.session.execute(db.select([User.date_joined, User.date_joined + timedelta(seconds=2)], limit=1)).fetchall()
TypeError: expected string or buffer
>>> db.session.execute(db.select([User.date_joined, User.date_joined + 2], limit=1)).fetchall()
[(datetime.datetime(2010, 5, 28, 23, 8, 22, 476708), 2012)]
>>> db.session.execute(db.select([User.date_joined+0, User.date_joined + 2], limit=1)).fetchall()
[(2010, 2012)]
Ich weiß nicht, warum die erste ausfällt auf MySQL und warum es schwimmt zurück. Die SQLite-Fehler scheinen zu geschehen, weil SQLite does not have a DATETIME data type and SQLAlchemy stores it as a string.
Sie müssen damit ein wenig herumspielen, vielleicht finden Sie einen Weg, der funktioniert - aber ich denke, um wirklich dbms unabhängig bleiben die Ganzzahl-Methode wird der einzig gangbare Weg sein.
Diese Ausgabe eines anderen Formats für Zeitobjekte kann Kopfschmerzen bereiten! – Escualo