Koks yra skirtumas tarp filtro ir filtro „SQLAlchemy“?

Ar kas nors gali paaiškinti skirtumą tarp filter ir filter_by „SQLAlchemy“? Aš supainioti ir nematau skirtumo. Kuris turėčiau naudoti?

180
24 янв. nustatė bodacydo 24 d. 2010-01-24 22:49 '10, 10:49 PM 2010-01-24 22:49
@ 5 atsakymai

filter_by naudojamas paprastoms užklausoms stulpelių pavadinimuose, naudojant įprastas kwargs, pvz.,

db.users.filter_by(name='Joe')

Tą patį galima padaryti naudojant filter , o ne naudojant kwargs, bet naudojant lygybės operatorių '==', kuris buvo perkrautas db.users.name objekte:

db.users.filter(db.users.name=='Joe')

Taip pat galite rašyti galingesnes užklausas naudodami filter :

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))

221
24 янв. Atsakymas duotas Daniel Velkov 24 sausis 2010-01-24 23:02 '10, 23:02, 2010-01-24 23:02

Mes iš tikrųjų sujungėme juos iš pradžių, t.y. buvo „filtras“ panašus metodas, kuris užėmė * args ir ** kwargs, kur galėjote perduoti SQL išraiškas ar raktinius žodžius (arba abu). Aš iš tikrųjų manau, kad tai yra daug patogiau, bet žmonės visada buvo supainioti, nes jie vis dar įveikia skirtumą tarp column == expression ir keyword = expression . Todėl mes juos padalijome.

90
29 янв. atsakymas pateikiamas zzzeek 29 jan. 2010-01-29 00:04 '10 - 0:04 2010-01-29 00:04

filter_by naudoja raktinių žodžių argumentus, o filter leidžia pythoninius filtravimo argumentus, pvz., filter(User.name=="john")

29
24 янв. Johannes Charra atsakymas Jan 24 2010-01-24 23:04 '10, 23:04, 2010-01-24 23:04

Tai yra sintaksinis cukrus, skirtas greičiau užregistruoti užklausas. Jos įgyvendinimas pseudokode:

 def filter_by(self, **kwargs): return self.filter(sql.and_(**kwargs)) 

Dėl Ir jūs galite rašyti:

 Users.query.filter_by(name='Joe', surname='Dodson') 

btw

 db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England')) 

gali būti parašyta kaip

 db.users.filter((db.users.name=='Ryan') | (db.users.country=='England')) 

Objektą taip pat galite gauti tiesiogiai PK, naudodami gavimo metodą:

 Users.query.get(123) # And even by a composite PK Users.query.get(123, 321) 

Naudojant gautą argumentą svarbu, kad objektas būtų grąžintas be duomenų bazės užklausos iš identity map , kurį galima naudoti kaip talpyklą (susietą su sandoriu)

20
22 июля '15 в 13:45 2015-07-22 13:45 atsakymas pateikiamas liepos 22 d., 15 val. 15:45 pm 2015-07-22 13:45

skirtumas tarp filter() ir filter_by() yra tas, kad pirmasis ( filter() ) veikia kaip or (||) operatorius, o filter_by() veikia kaip and (> operatorius. filter() įvertina teisingumą, jei bet kuris iš pateiktų argumentų yra True . Jis lygina jį su == piktograma. Dabar „ filter_by() įvertina „ True jei ir tik tada, jei visi pateikti argumentai yra vertinami „ True . Todėl reikia skambinti kiekvienai funkcijai, nes jie vienodai vertina jų argumentus. „Checkout“ šiame pavyzdyje:

 borrowedlist = Borrowedbooks.query.filter_by(bookid = bookid, userid = userid, status = 'false').first() if borrowedlist == None: return None return borrowedlist 

grąžina True jei ir tik tada, jei visi aukščiau pateikti argumentai grąžina True kol:

 borrowedlist = Borrowedbooks.query.filter(bookid == bookid, userid == userid, status == 'false').first() if borrowedlist == None: return None return borrowedlist 

grįš True jei bet kuris iš pateiktų argumentų įvertins True

-2
28 сент. atsakymas duotas koduotė 28 sep . 2016-09-28 12:34 '16 at 12:34 pm 2016-09-28 12:34

Kiti klausimai apie arba Užduoti klausimą