paint-brush
Python: Tebelelo e Tebileng Kamoo Dikgwebišano tša Django di Šomagoka@mta
134 dipuku tša go balwa Histori e mpsha

Python: Tebelelo e Tebileng Kamoo Dikgwebišano tša Django di Šomago

ka Michael T. Andemeskel9m2025/03/02
Read on Terminal Reader

Nako e telele kudu; Go bala

Django's transaction.atomic () e ka šomišwa go hlama ditirišano go phethagatša ditiro tša athomo - ditiro tša DB tšeo di kgonthišitšwego go phethagatša ka moka le go bolokwa mmogo goba tša palelwa. Django e hlola ditirišano ka go šomiša mokgwa wa kgwebišano wa DB ya motheo, e phethagatša khoutu ka kgwebišano, gomme ge go se na diphošo tšeo di diregago, e itlama kgwebišano go DB.
featured image - Python: Tebelelo e Tebileng Kamoo Dikgwebišano tša Django di Šomago
Michael T. Andemeskel HackerNoon profile picture
0-item


Diteng

  • TLDR - Kakaretšo ya Django Kgwebišano Logic
  • Seswantšho sa Logic
  • Dikgwebišano & Mešomo ya ATOMIC
  • Dikgwebišano ka Django
  • Django jarolla ka ho iketsa mokgwa wa - Tima Dikgwebišano jarolla ka ho iketsa
  • Methopo

TLDR - Kakaretšo ya Django Kgwebišano Logic

Se ke sa didirišwa tšeo di sepetšago Django ka PSQL goba SQL ye nngwe ye e swanago (SQLite, MySQL, bjalobjalo) yeo e theilwego go dipolokelo tša tshedimošo (DBs); melawana ya motheo go dikologa ditirišano e ka no se šome go di-DB tše dingwe. Ka tlase ga hood, khoutu ya taolo ya kgwebišano ya Django e dira tše di latelago (se se kopišitšwe go tšwa go doc ya Django -scroll down- ka dintlha tša ka tša kulo bakeng sa tlhathollo):


  • E bula kgwebišano ge e tsena ka bolokong ya athomo ya ka ntle kudu;
    • E hwetša goba e hlola kgokagano go DB gomme e e beakanya bjalo ka kgwebišano.


  • E kgopela le go hwetša dinotlelo ge go kopana le tshepedišo ya DB;
    • Ditiro ka moka tša DB di nyaka dinotlelo - dinotlelo tše dingwe di lokologile gomme di tla dumelela dikgokagano tše dingwe go phethagatša ditiro mohloding o swanago, eupša dinotlelo tše dingwe di thata kudu; di ikgethile gomme di tla thibela bobedi ditiro tša go bala le go ngwala. Go hlama, go mpshafatša, le go phumola direkhoto, gammogo le go fetoša ditafola le dikholomo, go tla hwetša dinotlelo tše di tiilego kudu tšeo di tlago thibela dikgokagano tše dingwe go phethagatša ditiro. Dinotlelo tše di swaretšwe go fihlela kgwebišano e fela.


  • E hlola ntlha ya go boloka ge o tsena ka gare ga boloko ya athomo;
    • Se se dirwa ka go iketla ge, mohlala, go tsenya direkhoto tafoleng — ditiro tše dingwe tša mohlala di tla iphuthelela ka go iketla ka dibolokong tša athomo.

    • Se se ka dirwa ka seatla ka go bitša mošomo wo o phuthetšwego ke atomic () goba go šomiša atomic () ka go polelo ya with (bjalo ka molaodi wa seemo).

    • Savepoints tla sebelisa kgokelo e tšoanang le kgwebisano ka ntle — haeba u sheba khoutu ya Django bakeng sa savepoints, ke feela pitso recursive ho bopa kgwebisano e 'ngoe.

    • Savepoints ka nested ka hare ho savepoints - mokgobo boloka pina ya savepoints.


  • E lokolla goba e kgokologela morago ntlheng ya go boloka ge e tšwa ka bolokong ya ka gare;
    • Ka morago ga go tsenywa, ntlha ya go boloka e tlošwa e ka ba ka go dira diphetogo le go di dira gore di hwetšagale go kgwebišano ka moka (eupša ESENG dikgokagano tše dingwe) goba ka go bušetša morago diphetogo.


  • Ge khoutu yeo e sa kgomego DB e kopana le khoutu e phethagatšwa bjalo ka mehleng;
    • Dinotlelo go DB di sa swerwe mola logiki yeo e sego ya DB e phethagatšwa, mohlala, ge re romela kgopelo ya HTTP ka mmeleng wa kgwebišano, dinotlelo di tla swarwa go fihlela kgopelo yeo e romelwa gomme karabo e bušetšwa morago. Django ga e lokolle dinotlelo ge re emiša go phethagatša ditiro tša DB. E swara dinotlelo GO FIHLELA kgwebišano ya ka ntle e fedile.

    • Dinotlelo tšeo di hweditšwego ka ditirišanong tša go tsenywa ka gare ga sehlaga le tšona di swarwa go fihlela kgwebišano ya ka ntle e fedile goba kgwebišano ye e tsentšwego ka gare ga sehlaga e bušetšwa morago.


  • Ge RuntimeError e direga goba phošo e tsošwa ka ntle ga DB (e sa amanago le ditiro tša DB);
    • Kgwebišano e a emišwa, e bušetšwa morago gomme dinotlelo di a lokollwa.

    • Ge phošo e direga ka kgwebišano ye e tsentšwego ka gare ga sehlaga, kgwebišano ya ka ntle ga e amege. Go bušetša morago go direga eupša kgwebišano ya ka ntle e ka tšwela pele e sa šitišwe (ge fela phošo ye e rotošitšwego e swerwe le go swarwa).

    • Dikgwebišano ga di sware diphošo, eupša di ithekgile ka tšona go tseba gore ke neng go bušetša morago diphetogo. Ka fao, o se ke wa phuthela ditiro tša DB ka go leka/ntle le, go e na le moo, di phuthele ka kgwebišano gomme ka morago o phuthele kgwebišano ka go leka/ntle le. Go dira bjalo go dumelela tshepedišo ya DB go palelwa gomme ya bušetšwa morago ka go itiragalela ntle le go ama kgwebišano ya ka ntle.


  • E itlama goba e bušetša morago kgwebišano ge e tšwa ka bolokong ya ka ntle kudu.
    • Sa mafelelo, kgwebišano ka moka e itlamile, e dira gore diphetogo di hwetšagale go badiriši/dikgokagano ka moka tša DB. Goba e bušetšwa morago, e tlogela DB e le boemong bjo bo swanago le bjo e bego e le bjona ge kgwebišano e kopana le yona.


Blog ye e latelago, ke tla ngwala ka seo o swanetšego go se bea goba o sa swanelago go se bea kgwebišano go efoga go kgaotša mo go hlolwago ke tlala ya dinotlelo.

Seswantšho sa Logic

Logic Seswantšho sa Dikgwebišano tša Django — Ka botlalo

Dikgwebišano & Mešomo ya ATOMIC

Dikgwebišano ke mekgwa yeo e dumelelago di-DB tša ACID (PSQL, SQL, MongoDB ya moragorago , bjalobjalo) go ba ATOMIC (A ka go ACID). Se se ra gore dingwalwa ka moka go DB di dirwa bjalo ka tshepedišo e tee — go sa šetšwe gore go raragane gakaakang. Ge go ngwala go atlega, diphetogo ka moka go DB di a phegelela gomme di hwetšagala go dikgokagano ka moka ka nako e tee (ga go na go ngwala ka karolo). Ge go ngwala go palelwa, diphetogo ka moka di bušetšwa morago — gape, ga go na diphetogo tše di sa felego.


Dikgwebišano di tiišetša melawana ye:

  • Datha ka DB e ka se fetoge gare ga kgwebišano.
  • Ga go kgokagano ye nngwe yeo e tlago kgona go bona diphetogo tšeo di dirilwego ke kgwebišano go fihlela e fedile.
  • DB e tla ba le ya data ka moka e mpsha goba ga e na le e tee ya yona.


Melawana ye e dumelela modiriši wa DB go kopanya ditiro tše di raraganego mmogo le go di phethagatša bjalo ka tshepedišo e tee. Ka mohlala, go phethagatša phetišetšo go tšwa akhaontong e nngwe ya panka go ya go e nngwe; ge e ba re be re se na ditirišano, gona gare ga ditiro tše tše pedi tša go ngwala, go ka ba le go ntšha tšhelete goba gaešita le tshepedišo ya akhaonto ya go tswalela yeo e dirago gore phetišetšo e se šome. Dikgwebišano di dumelela mosediriši mohuta wo mongwe wa taolo ya sephethephethe. Re ka thibela ditiro tše dingwe ka moka tšeo di thulanago ge kgwebišano e tšwela pele.


Ditiro di thibetšwe ka letoto la dinotlelo ditafoleng le mela. Ka PSQL le diphetogo tše dingwe tša SQL, ditirišano di hlolwa ka BEGIN; ke moka dinotlelo di hwetšwa ge tshepedišo ya go swana le kgetha/tsenya/phumola/fetola e sepedišwa gomme ditirišano di fela ka COMMIT goba ROLLBACK. Dinotlelo di lokollwa ge COMMIT goba ROLLBACK e phethagatšwa. Ka mahlatse, Django e re dumelela go hlama ditirišano ntle le go swanelwa ke go šomiša dipolelo tše tše tharo (eupša re sa swanetše go tshwenyega ka dinotlelo; go feta ka seo posong ye e latelago).


 -- Start a new transaction BEGIN; SELECT … INSERT INTO … UPDATE … DELETE FROM … -- Save the changes COMMIT;


  • Kgetha e hwetša dinotlelo tšeo di thibelago diapdeite methaleng yeo e balwago.
  • Tsenya e hwetša dinotlelo tšeo di thibelago diapdeite methaleng yeo e hlolwago.
  • Mpshafatšo e hwetša dinotlelo tšeo di thibelago diapdeite methaleng yeo e mpshafatšwago.
  • Go phumola go hwetša dinotlelo tšeo di thibelago diapdeite methaleng yeo e phumolwago.
  • Ga re hloke go hlahloba ka go lebanya diphošo le go bitša ROLLBACK — kgwebišano e re direla se.
  • Ge nkabe go na le tshepedišo ya tafola ya go fetoša ka kua, e be e tla thibela go bala le go ngwala ka moka tafoleng (tše ntši ka se go blog ye e latelago).

Dikgwebišano ka Django

 from django.db import transaction from app.core.models import Accounts, Fee, NotificationJob def do_migration(): overdrawn_accounts = Accounts.objects.filter(type='overdrawn') for acount in overdrawn_accounts: create_notification(acount) @transaction.atomic def create_notification(acount: Accounts): # $5 fee for overdraft - 500 because we never store money as float!!! recall = Fee.objects.create(acount=acount, description='Fee for overdraft', amount=500) NotificationJob.objects.create(recall=recall, notification_type='all') acount.status = 'awaiting_payment' acount.save() def do_migration2(): overdawn_account = Accounts.objects.filter(type='overdrawn') for account in overdawn_account: with transaction.atomic(): recall = Fee.objects.create(acount=account, description='Fee for overdraft', amount=500) NotificationJob.objects.create(recall=recall, notification_type='all') account.status = 'awaiting_payment' account.save()


Django ka tsela e iketsang phuthela mong le e mong DB tshebetso ka kgwebisano bakeng sa rona ha matha ka mokgwa wa autocommit (ho feta ka seo ka tlase). Dikgwebišano tše di lego molaleng di ka hlolwa ka go šomiša mokgabiši wa atomic () goba molaodi wa seemo (ka atomic ()) — ge atomic () e šomišwa, ditiro tša DB ka botee GA di phuthelwe ka kgwebišano goba di itlama ka pela go DB (di phethagatšwa, eupša diphetogo go DB ga di bonagale go badiriši ba bangwe). Go e na le moo, mošomo ka moka o phuthetšwe ka gare ga boloko bja kgwebišano gomme o itlama mafelelong (ge e ba go se na diphošo tšeo di rotošitšwego) — COMMIT e a phethagatšwa.


Ge e ba go na le diphošo, diphetogo tša DB di bušetšwa morago — ROLLBACK e a phethagatšwa. Ke ka lebaka leo ditirišano di swarago dinotlelo go fihla mafelelong; ga re nyake go lokolla senotlelo tafoleng, go dira gore kgokagano ye nngwe e fetoše tafola goba e e bale, gomme ka morago ra gapeletšega go bušetša morago seo se sa tšwago go fetošwa goba se balwago.


 ANGRY_CUSTOMER_THRESHOLD = 3 @transaction.atomic def create_notification(acount: Accounts): recall = Fee.objects.create(acount=acount, description='Fee for overdraft', amount=500) NotificationJob.objects.create(recall=recall, notification_type='all') try: # when this completes successfully, the changes will be available to the outer transaction with transaction.atomic(): owner = acount.owner fees = Fee.objects.filter(owner=owner).count() if fees >= ANGRY_CUSTOMER_THRESHOLD: for fee in fees: fee.amount = 0 fee.save() owner.status = 'angry' owner.save() # as long as we catch the error, the outer transaction will not be rolled back except Exception as e: logger.error(f'Error while removings fees for account {acount.id}: {e}') acount.status = 'awaiting_payment' acount.save()


Re ka boela ra sehlaga ditirišano ka go bitša mošomo wo mongwe wo o phuthetšwego ke atomic () goba go šomiša molaodi wa seemo ka gare ga kgwebišano. Se se re dumelela go hlama mafelo a go boloka moo re ka lekago ditiro tše di nago le kotsi ntle le go ama kgwebišano ka moka — ge kgwebišano ya ka gare e lemogwa, ntlha ya go boloka e hlolwa, kgwebišano ya ka gare e phethagatšwa, gomme ge kgwebišano ya ka gare e palelwa, ya data e bušetšwa morago ntlheng ya go boloka gomme kgwebišano ya ka ntle e tšwela pele. Ge kgwebišano ya ka ntle e palelwa, ditirišano ka moka tša ka gare di bušetšwa morago go bapa le kgwebišano ya ka ntle. Go bea dihlaga ga kgwebišano go ka thibelwa ka go beakanya durable=True ka go atomic () — se se tla dira gore kgwebišano e tsoše RuntimeError ge e le gore ditirišano dife goba dife tša ka gare di lemogilwe.


Seo o swanetšego go se gopola ka ga ditirišano tša go tsenywa ka gare ga sehlaga:

  • Dikgwebišano tše di tsentšwego ka gare ga sehlaga GA DI lokolle dinotlelo ntle le ge ditirišano tše di tsentšwego di bušetšwa morago goba kgwebišano ya ka ntle e itlamile goba e bušetšwa morago.
  • Dikgwebišano tše di tsentšwego ka gare ga sehlaga GA DI sware diphošo tša DB; ba fo bušetša morago ditiro kgwebišano yeo e bakilego phošo. Re sa swanetše go swara phošo ya DB gore kgwebišano ya ka ntle e tšwele pele.
  • Diphetogo tše di dirilwego ka ditirišanong tša go tsenywa ka gare ga sehlaga di hwetšagala go kgwebišano ya ka ntle le ditirišano tša go tsenywa ka gare ga sehlaga tše di latelago.

Django Autocommit Mode - Tima Dikgwebišano tša go Itiriša

 DATABASES = { 'default': { # True by default 'AUTOCOMMIT': False, # ...rest of configs } }

Ka go ikemela, Django e šoma ka mokgwa wa go itiriša , go ra gore tshepedišo ye nngwe le ye nngwe ya DB e phuthetšwe ka kgwebišano gomme e sepela ka pela (e itlama, ka fao e itlama ka go itiriša) ntle le ge tshepedišo e phuthetšwe ka go lebanya ka kgwebišano ke mosediriši. Se se šitiša tlhaologanyo ya kgwebišano ya DB ya motheo — di-DB tše dingwe, go swana le PSQL, di phuthela ka go iketla ditiro ka moka ka ditirišanong mola tše dingwe di sa dire bjalo. Ge re na le Django yeo e re direlago se, ga re hloke go tshwenyega ka logic ya DB ya motheo.


Re ka tima mokgwa wa autocommit, eupša seo se be se tla re tlogela re ithekgile ka DB go laola ditiro le go netefatša gore ke ATOMIC, yeo e nago le kotsi le yeo e sa lokelago bahlami. E ka se be mo go thabišago ge e ba, ge re be re hlama API, re ile ra swanelwa ke go hwetša gore ke ditiro dife tša go ngwala tšeo di lego ditirišanong gomme, ka fao, di tla ngwalwa ka palomoka e sego ka karolo.


Le ge go le bjalo, re ka nyaka go tima mokgwa wa go itlama ge re tseba palo ya dikgokagano go DB le tatelano ya ditiro tšeo di di phethagatšago. Ge re ka hwetša gore re ka tloša thulano bjang ditiro tše, gona re ka tima mokgwa wa go itlama ka go itiriša gomme ra hwetša bokgoni bjo bongwe:

  • Re tloša ditaelo tše pedi go tšwa go tshepedišo ye nngwe le ye nngwe: BEGIN le COMMIT/ROLLBACK. Eupša bontši bja di-DB di phuthela ka go iketla tshepedišo e nngwe le e nngwe ka kgwebišano ka gona se se ka ba se se nago mohola.
  • Dinotlelo di ka se swarelwe nako ye telele kudu — gateetee ge tshepedišo e fela, dinotlelo tšeo e di swerego di a lokollwa, ge di bapetšwa le go leta gore kgwebišano ka moka e fele.
  • Di-deadlock ga di kgonege kudu - di-deadlock di direga ge ditirišano tše pedi di nyaka senotlelo seo kgwebišano ye nngwe e se swerego. Se se tlogela ditirišano ka bobedi di emetše gore ye nngwe e fetše, eupša ga go le e tee yeo e ka fetšago. Lega go le bjalo, di- deadlock di sa dutše di ka direga. Ditiro tše dingwe tša DB di tla dira go ngwala tše ntši mohlala, go mpshafatša kholomo yeo e nago le tšhupamabaka go yona go tla mpshafatša kholomo le tšhupamabaka (go ngwala tše pedi bonyenyane). Se se ka lebiša go ditšhitišo ge kgokagano ye nngwe e leka go šoma methaleng goba dikholomong tše di amegilego.


Dilo tše mpe ke dikotsi tše di phagamego tša bomenetša bja data. Ga go na mohola, eupša mohlomongwe go na le taba ya tšhomišo yeo ke sa kgonego go e nagana.

Methopo


L O A D I N G
. . . comments & more!

About Author

Michael T. Andemeskel HackerNoon profile picture
Michael T. Andemeskel@mta
I write code and, occasionally, bad poetry. Thankfully, my code isn’t as bad as my poetry.

HANG TAGS YA GO FEGA

ARTICLE YE E HLAHILWE KA...