operatore or_ può essere utile in caso di numero imprecisato di OR componenti di query.
Ad esempio, supponiamo di creare un servizio REST con pochi filtri opzionali, che dovrebbe restituire un record se uno qualsiasi dei filtri restituisce true. Dall'altro lato, se il parametro non è stato definito in una richiesta, la nostra query non dovrebbe cambiare. Senza or_ funzione dobbiamo fare qualcosa di simile:
query = Book.query
if filter.title and filter.author:
query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author)))
else if filter.title:
query = query.filter(Book.title.ilike(filter.title))
else if filter.author:
query = query.filter(Book.author.ilike(filter.author))
Con or_ funzione può essere riscritto per:
query = Book.query
not_null_filters = []
if filter.title:
not_null_filters.append(Book.title.ilike(filter.title))
if filter.author:
not_null_filters.append(Book.author.ilike(filter.author))
if len(not_null_filters) > 0:
query = query.filter(or_(*not_null_filters))
Si noti che questo approccio supporta l'utilizzo di generatori, quindi se avete una lunga lista di cose da O, si può fare 'filtro (or_ (User.name == v per v in ('Alice', 'Bob', 'Carl'))) ' – robru
@ Il consiglio di Robru è inutilmente inefficiente. Se hai già una collezione, dovresti usare l'operatore 'in_' in questo modo:' filter (User.name.in _ (['Alice', 'Bob', 'Carl'])) ' – intgr
Ah grazie non ne ero a conoscenza sqlalchemy aveva quel filtro – robru