Pozwól mi najpierw wyjaśnić, dlaczego to, co próbowałeś, nie działa. SQLAlchemy jest po prostu wygodnym sposobem pisania zapytań SQL, wszystkie zapytania są jednak wykonywane po stronie zdalnej. Kolumny SQLAlchemy są specjalnymi obiektami, których metody są nadpisywane, aby zwrócić nie inne obiekty specjalne, które pamiętają obiekt, z którym zostały porównane i mogą później wygenerować odpowiednie instrukcje SQL. To samo dotyczy dodawania itd .: Metoda niestandardowa nie zwraca liczby lub połączonego ciągu, ale także takiego obiektu, który generuje instrukcję sql. Możesz porównać/dodać je do łańcuchów, liczb całkowitych itp., Innych kolumn, instrukcji wyboru, wywołań funkcji mysql itp., , ale nie do specjalnych obiektów pythonowych, takich jak timedeltas. (uproszczony i prawdopodobnie nie technicznie w 100% poprawne;))
Więc co można zrobić, to:
- Wprowadź wartości w całkowitych baz danych, np sygnatury czasowe unix. W ten sposób twoje zapytanie
between
zadziała (z 2
zamiast delta)
- Użyj funkcji po stronie bazy danych, aby przekonwertować datę formatu datetime na uniksowy znacznik czasu, a następnie dokonać porównania.
UPDATE: Grałem około trochę z tym, i jakoś to nie praca, to nawet jest typem Interval
danych. Jednak przynajmniej tutaj nie działa prawidłowo:
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)]
Nie wiem, dlaczego nie pierwsza na MySQL i dlatego zwraca pływaków. Błędy SQLite wydają się występować, ponieważ SQLite does not have a DATETIME data type and SQLAlchemy stores it as a string.
Będziesz musiał trochę się z tym bawić, może znajdziesz sposób, który działa - ale myślę, że aby pozostać naprawdę niezależnym od DBMS, metoda liczby całkowitej będzie jedynym możliwym sposobem.
To wydanie różnych formatów obiektów czasu może stać się bólem głowy! – Escualo