ARBA naudojimas SQLAlchemijoje

Žiūrėjau dokumentus ir negaliu rasti, kaip vykdyti OR užklausą SQLAlchemy. Aš tik noriu pateikti šį prašymą.

 SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey') 

Tai turi būti kažkas panašaus

 addr = session.query(AddressBook).filter(City == "boston").filter(????) 
117
30 окт. nustatė JiminyCricket spalio 30 d 2011-10-30 03:17 '11 at 3:17 2011-10-30 03:17
@ 4 atsakymai

pamokos :

 from sqlalchemy import or_ filter(or_(User.name == 'ed', User.name == 'wendy')) 
191
30 окт. Atsakymas, kurį pateikė Bastien Léonard, spalio 30 d 2011-10-30 03:22 '11 at 3:22 2011-10-30 03:22

SQLAlchemy perkrauna bitų operatorius > , | ir ~ , todėl vietoj bjaurių ir sunkiai perskaitytų prefiksų or_() naudodami or_() ir and_() (pavyzdžiui, Bastien atsakyme ), galite naudoti šiuos teiginius:

 .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey')) 

Atkreipkite dėmesį, kad skliaustai yra neprivalomi dėl bitų operatorių pirmenybės.

Taigi, visa užklausa gali atrodyti taip:

 addr = session.query(AddressBook) \ .filter(AddressBook.city == "boston") \ .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey')) 
218
06 янв. atsakymą pateikė ThiefMaster 06 sausis 2013-01-06 21:23 '13, 21:23, 2013-01-06 21:23
Operatorius

arba_ gali būti naudinga nežinomo OR užklausos komponentų skaičiaus atveju.

Pvz., Tarkime, kad sukuriame REST paslaugą su keliais pasirinktiniais filtrais, kurie turi grąžinti įrašą, jei bet kuris iš filtrų yra teisingas. Kita vertus, jei parametras nebuvo nurodytas užklausoje, mūsų prašymas neturėtų keistis. Be ar_ funkcijos, turime tai padaryti:

 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)) 

Naudojant funkciją arba_, ją galima perrašyti į:

 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)) 
17
26 мая '15 в 20:26 2015-05-26 20:26 Atsakymą davė Valaras gegužės 26 d. 15, 20:26 2015-05-26 20:26

Tai tikrai padėjo. Čia pateikiamas bet kurios lentelės įgyvendinimas:

 def sql_replace(self, tableobject, dictargs): #missing check of table object is valid primarykeys = [key.name for key in inspect(tableobject).primary_key] filterargs = [] for primkeys in primarykeys: if dictargs[primkeys] is not None: filterargs.append(getattr(db.RT_eqmtvsdata, primkeys) == dictargs[primkeys]) else: return query = select([db.RT_eqmtvsdata]).where(and_(*filterargs)) if self.r_ExecuteAndErrorChk2(query)[primarykeys[0]] is not None: # update filter = and_(*filterargs) query = tableobject.__table__.update().values(dictargs).where(filter) return self.w_ExecuteAndErrorChk2(query) else: query = tableobject.__table__.insert().values(dictargs) return self.w_ExecuteAndErrorChk2(query) # example usage inrow = {'eqmtvs_id': eqmtvsid, 'datetime': dtime, 'param_id': paramid} self.sql_replace(tableobject=db.RT_eqmtvsdata, dictargs=inrow) 
3
23 дек. atsakymas delpozov 23 d. 2016-12-23 02:54 '16 at 2:54 2016-12-23 02:54

Kiti klausimai apie arba Užduoti klausimą