Píšem aplikáciu, ktorá používa SQLAlchemys databázou SQLite. Verím, že moja databáza, tabuľky a mapovanie sú správne nakonfigurované, pretože ostatné operácie fungujú podľa očakávania. Snažím sa napísať funkciu, ktorá načíta všetky objekty, ktorých dátumové pole sa zhoduje s dátetime.date () dodávaným ako parameter funkcie. Tu je môj prvý pokus:
def get_objects_matching_date(session,my_date):
return session.query(Table).filter(Table.date_field == my_date).all()
Udalosť však viem Table
obsahuje objekty zodpovedajúce kritériám, funkcia nevracia nič.
Viem z čítania Dokumentácia SA sqlite nemá natívnu podporu pre date
alebo datetime
typy a že sú uložené ako reťazce. SA by však mal zabezpečiť prevod na (pri vrátení výsledkov) a z (pri vkladaní záznamov) date
alebo datetime
objektov. Predpokladám, že by to malo byť schopné zvládnuť aj pri spustení porovnávacieho filtra. Prečítal som si niekoľko rôznych tém vlákna SO a zvážil som ich použitie between()
na odfiltrovanie zodpovedajúcich objektov my_date
, ale nezdá sa, že by to malo byť potrebné, keď je to presné ==
to, čo hľadám. Tiež som sa pozrel na používanie .filter(cast(Table.date_field,DATE) == my_date)
aby som zaistil, že dostávam porovnanie predmetov, ale nezdalo sa, že by to fungovalo.
Je zrejmé, že mi chýba niečo o spôsobe, akým SQLAlchemy spracováva dáta, najmä s databázami SQLite. Ako môžem získať presnú zhodu medzi a Date
uložené v SQLite db pomocou SQLAlchemy a datetime.date()
objekt zadaný ako parameter? Ďakujeme za pomoc.
odpovede:
4 pre odpoveď č. 1Môže to byť veľmi neskoro, ale je lepšie neskoro ako nikdy, takže by to mohlo prospieť ostatným :)
Skúste ich odovzdať do dnešného dňa:
from sqlalchemy import Date, cast
from datetime import datetime
created_at = datetime.now().date()
query.filter(cast(Model.created_at, Date) == cast(created_at,Date))
0 pre odpoveď č. 2
Problém skutočne spočíval v konverzii medzi reťazcami (znázornenie Date
objekty v SQLite) a date
predmety v Pythone. Zdá sa, že nižšie uvedené riešenie funguje dobre, napriek sledovaniu pomerne dlhej postupnosti konverzií medzi dátovými typmi (dátum-> datetime-> reťazec). Možno existuje aj iný spôsob, ale funguje to.
def get_objects_matching_date(session,my_date):
return session.query(Table).
filter((strftime("%Y-%m-%d",datetime.combine(my_date,time()).timetuple())).all()