/ / Porovnanie dátumov s SQLAlchemy, SQLite - python, databáza, sqlite, sqlalchemy

Porovnanie dátumov so SQLAlchemy, SQLite - python, databázou, sqlite, sqlalchemy

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ď č. 1

Môž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()