SQLAlchemy: Koks skirtumas tarp nuleidimo () ir įsipareigojimo ()?

Koks skirtumas tarp „SQLAlchemy“ flush() ir commit() ?

Aš perskaičiau dokumentus, bet aš nesu protingesnis - atrodo, manau, kad nežinau.

Mane ypač domina jų poveikis atminties naudojimui. Į duomenų bazę įkeliu kai kuriuos duomenis (iš viso apie 5 mln. Eilučių), o mano sesija kartais sumažėja - tai didelė duomenų bazė ir mašina su maža atmintimi.

Įdomu, jei naudoju per daug commit() ir nepakankamo flush() skambučių, bet nesuprantu, koks yra skirtumas, sunku pasakyti!

258
17 нояб. AP257 nustatytas lapkričio 17 d. 2010-11-17 07:20 '10, 7:20, 2010-11-17 07:20
@ 2 atsakymai

Sesijos objektas iš esmės yra dabartinis duomenų bazės pakeitimų sandoris (atnaujinimas, įterpimas, ištrynimas). Šios operacijos nėra saugomos duomenų bazėje tol, kol jos nebus įvykdytos (jei jūsų sesija nutraukiama dėl kokios nors priežasties sesijos viduryje, bet kokie nepadaryti pakeitimai viduje prarandami).

Sesijos objektas registruoja operacijų operacijas, naudodamas session.add() , tačiau dar nepersiunčia jų į duomenų bazę, kol nebus iškviestas session.flush() .

session.flush() susieja operacijų seriją su duomenų baze (įterpti, atnaujinti, ištrinti). Duomenų bazė palaiko juos kaip laukiančias operacijos operacijas. Pakeitimai visam laikui neišsaugomi į diską arba matomi kitiems sandoriams tol, kol duomenų bazė negaus COMMIT už dabartinį sandorį (tai yra session.commit() ).

session.commit() įrašo (išsaugo) šiuos pakeitimus duomenų bazėje.

flush() visada vadinamas commit() ( 1 ) skambutis.

Kai duomenų bazės užklausai naudojate Sesijos objektą, užklausa grąžina rezultatus iš duomenų bazės ir iš raudonųjų dalių, susijusių su neprisiimtu sandoriu. Pagal numatytuosius nustatymus automatinio autoflush sesijos autoflush vykdomi, tačiau tai gali būti išjungta.

Tikiuosi, kad šis pavyzdys taps aiškesnis:

 #--- s = Session() s.add(Foo('A')) # The Foo('A') object has been added to the session. # It has not been committed to the database yet, # but is returned as part of a query. print 1, s.query(Foo).all() s.commit() #--- s2 = Session() s2.autoflush = False s2.add(Foo('B')) print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned # as part of this query because it hasn't # been flushed yet. s2.flush() # Now, Foo('B') is in the same state as # Foo('A') was above. print 3, s2.query(Foo).all() s2.rollback() # Foo('B') has not been committed, and rolling # back the session transaction removes it # from the session. print 4, s2.query(Foo).all() #--- Output: 1 [<Foo('A')>] 2 [<Foo('A')>] 3 [<Foo('A')>, <Foo('B')>] 4 [<Foo('A')>] 
305
17 нояб. Atsakymas suteikiamas 17 val. 2010-11-17 09:25 '10, 9:25 val. 2010-11-17 09:25

Kaip sako @Snapshoe

flush() siunčia SQL duomenis į duomenų bazę

commit() įvykdo sandorį.

Kai sesija.autocommit == klaidinga:

įsipareigoti () skambins „flush“ (), jei jūsų autoflusas == tiesa.

Kai sesija.autocommit == tiesa:

Negalite skambinti įsipareigojimui (), jei dar nepradėjote operacijos (kuri tikriausiai nėra, nes tikriausiai šį režimą naudosite tik norėdami išvengti rankinio operacijų valdymo).

Šiame režime turite skambinti „flush“ (), kad išsaugotumėte ORM pakeitimus. Efektas taip pat fiksuoja jūsų duomenis.

8
16 окт. Jokūbo atsakymas spalio 16 d 2016-10-16 20:06 '16 at 20:06 2016-10-16 20:06

Peržiūrėkite kitus klausimus apie „ arba užduokite klausimą