PÔhjalik juhend SQLAlchemy sessioonihalduseks Pythonis, keskendudes robustsetele tehingute kÀsitlemise tehnikatele andmete terviklikkuse ja jÀrjepidevuse tagamiseks teie rakendustes.
Python SQLAlchemy sessioonihaldus: tehingute kÀsitlemise meisterlikkus andmete terviklikkuse tagamiseks
SQLAlchemy on vĂ”imas ja paindlik Pythoni teek, mis pakub laiaulatuslikku tööriistakomplekti andmebaasidega suhtlemiseks. SQLAlchemy sĂŒdames on sessiooni kontseptsioon, mis toimib vahepeatusena kĂ”ikidele andmebaasis tehtavatele operatsioonidele. Korralik sessiooni- ja tehinguhaldus on andmete terviklikkuse sĂ€ilitamiseks ja andmebaasi jĂ€rjepideva kĂ€itumise tagamiseks ĂŒlioluline, eriti keerukates rakendustes, mis tegelevad samaaegsete pĂ€ringutega.
SQLAlchemy sessioonide mÔistmine
SQLAlchemy sessioon esindab tĂ¶Ă¶ĂŒhikut, vestlust andmebaasiga. See jĂ€lgib objektidele tehtud muudatusi, vĂ”imaldades teil neid andmebaasi salvestada ĂŒhe aatomilise operatsioonina. MĂ”elge sellest kui tööruumist, kus teete andmetes muudatusi enne nende ametlikku salvestamist. Ilma hĂ€sti hallatud sessioonita riskite andmete ebajĂ€rjepidevuse ja vĂ”imaliku rikkumisega.
Sessiooni loomine
Enne kui saate oma andmebaasiga suhtlema hakata, peate looma sessiooni. See hĂ”lmab esmalt ĂŒhenduse loomist andmebaasiga SQLAlchemy mootori abil.
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# Andmebaasi ĂŒhenduse string
db_url = 'sqlite:///:memory:' # Asendage oma andmebaasi URL-iga (nt PostgreSQL, MySQL)
# Looge mootor
engine = create_engine(db_url, echo=False) # echo=True genereeritud SQL-i nÀgemiseks
# MÀÀratlege deklaratiivsete mudelite baas
Base = declarative_base()
# MÀÀratlege lihtne mudel
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
def __repr__(self):
return f""
# Looge tabel andmebaasis
Base.metadata.create_all(engine)
# Looge sessiooniklass
Session = sessionmaker(bind=engine)
# Looge sessiooni eksemplar
session = Session()
Selles nÀites:
- Impordime vajalikud SQLAlchemy moodulid.
- MÀÀratleme andmebaasi ĂŒhenduse stringi (`db_url`). See nĂ€ide kasutab lihtsuse huvides mĂ€lusisest SQLite andmebaasi, kuid te asendaksite selle oma andmebaasisĂŒsteemile sobiva ĂŒhenduse stringiga (nt PostgreSQL, MySQL). Spetsiifiline vorming varieerub sĂ”ltuvalt kasutatavast andmebaasi mootorist ja draiverist. Ăige ĂŒhenduse stringi vormingu leidmiseks tutvuge SQLAlchemy dokumentatsiooni ja oma andmebaasi pakkuja dokumentatsiooniga.
- Loome `engine`-i kasutades `create_engine()`. Mootor vastutab ĂŒhenduste kogumi haldamise ja andmebaasiga suhtlemise eest. Parameeter `echo=True` vĂ”ib olla abiks silumisel, kuna see prindib genereeritud SQL-laused konsooli.
- MÀÀratleme baasklassi (`Base`) kasutades `declarative_base()`. Seda kasutatakse kÔigi meie SQLAlchemy mudelite baasklassina.
- MÀÀratleme `User` mudeli, kaardistades selle andmebaasi tabeliga nimega `users`.
- Loome tabeli andmebaasis kasutades `Base.metadata.create_all(engine)`.
- Loome sessiooniklassi kasutades `sessionmaker(bind=engine)`. See konfigureerib sessiooniklassi kasutama mÀÀratud mootorit.
- LÔpuks loome sessiooni eksemplari kasutades `Session()`.
Tehingute mÔistmine
Tehing on andmebaasioperatsioonide jada, mida kĂ€sitletakse ĂŒhe loogilise tĂ¶Ă¶ĂŒhikuna. Tehingud jĂ€rgivad ACID omadusi:
- Aatomilisus: KÔik tehingu operatsioonid kas Ônnestuvad tÀielikult vÔi ebaÔnnestuvad tÀielikult. Kui mÔni tehingu osa ebaÔnnestub, vÔetakse kogu tehing tagasi.
- JĂ€rjepidevus: Tehing peab hoidma andmebaasi kehtivas olekus. See ei tohi rikkuda ĂŒhtegi andmebaasi piirangut ega reeglit.
- Isolatsioon: Samaaegsed tehingud on ĂŒksteisest isoleeritud. Ăhe tehinguga tehtud muudatused ei ole teistele tehingutele nĂ€htavad enne, kui esimene tehing on kinnitatud.
- PĂŒsivus: Kui tehing on kinnitatud, on selle muudatused pĂŒsivad ja sĂ€ilivad isegi sĂŒsteemi rikete korral.
SQLAlchemy pakub mehhanisme tehingute haldamiseks, tagades nende ACID omaduste sÀilimise.
PÔhiline tehingute kÀsitlemine
KÔige levinumad tehinguoperatsioonid on kinnitamine (commit) ja tagasivÔtmine (rollback).
Tehingute kinnitamine
Kui kÔik tehingu operatsioonid on edukalt lÔpule viidud, kinnitate tehingu. See salvestab muudatused andmebaasi.
try:
# Lisa uus kasutaja
new_user = User(name='Alice Smith', email='alice.smith@example.com')
session.add(new_user)
# Kinnita tehing
session.commit()
print("Transaction committed successfully!")
except Exception as e:
# KĂ€sitle erindeid
print(f"An error occurred: {e}")
session.rollback()
print("Transaction rolled back.")
finally:
session.close()
Selles nÀites:
- Lisame sessiooni uue `User` objekti.
- Kutsume vÀlja `session.commit()`, et muudatused andmebaasi salvestada.
- Ămbritseme koodi `try...except...finally` plokiga, et kĂ€sitleda vĂ”imalikke erandeid.
- Kui tekib erand, kutsume vĂ€lja `session.rollback()`, et tĂŒhistada kĂ”ik tehingu kĂ€igus tehtud muudatused.
- Kutsume alati `session.close()` vĂ€lja `finally` plokis, et vabastada sessioon ja tagastada ĂŒhendus ĂŒhenduste kogumisse. See on ressursside lekke vĂ€ltimiseks ĂŒlioluline. Sessioonide sulgemata jĂ€tmine vĂ”ib pĂ”hjustada ĂŒhenduste ammendumist ja rakenduse ebastabiilsust.
Tehingute tagasivÔtmine
Kui tehingu ajal tekib viga vÔi kui otsustate, et muudatusi ei tohiks salvestada, vÔtate tehingu tagasi (rollback). See taastab andmebaasi oleku, mis oli enne tehingu algust.
try:
# Lisa kasutaja kehtetu e-posti aadressiga (nÀide tagasivÔtmise sundimiseks)
invalid_user = User(name='Bob Johnson', email='invalid-email')
session.add(invalid_user)
# Kinnitamine ebaÔnnestub, kui e-posti aadressi ei valideerita andmebaasi tasemel
session.commit()
print("Transaction committed.")
except Exception as e:
print(f"An error occurred: {e}")
session.rollback()
print("Transaction rolled back successfully.")
finally:
session.close()
Selles nĂ€ites, kui `invalid_user` lisamine tekitab erandi (nt andmebaasi piirangu rikkumise tĂ”ttu), tĂŒhistab `session.rollback()` kutse katsetatud sisestuse, jĂ€ttes andmebaasi muutmata.
TĂ€iustatud tehinguhaldus
`with`-lause kasutamine tehingute ulatuse mÀÀramiseks
Pythonilikum ja robustsem viis tehingute haldamiseks on kasutada `with`-lauset. See tagab, et sessioon suletakse korrektselt, isegi kui tekivad erandid.
from contextlib import contextmanager
@contextmanager
def session_scope():
"""Paku tehingulist ulatust operatsioonide seeria ĂŒmber."""
session = Session()
try:
yield session
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
# Kasutamine:
with session_scope() as session:
new_user = User(name='Charlie Brown', email='charlie.brown@example.com')
session.add(new_user)
# Operatsioonid 'with' ploki sees
# Kui erandeid ei teki, kinnitatakse tehing automaatselt.
# Kui tekib erand, vÔetakse tehing automaatselt tagasi.
print("User added.")
print("Transaction completed (committed or rolled back).")
Funktsioon `session_scope` on kontekstihaldur. Kui sisenete `with` plokki, luuakse uus sessioon. Kui vÀljute `with` plokist, sessioon kas kinnitatakse (kui erandeid ei esinenud) vÔi vÔetakse tagasi (kui esines erand). Sessioon suletakse alati `finally` plokis.
Pesastatud tehingud (salvestuspunktid)
SQLAlchemy toetab pesastatud tehinguid, kasutades salvestuspunkte (savepoints). Salvestuspunkt vÔimaldab teil naasta suurema tehingu sees kindlasse punkti, mÔjutamata kogu tehingut.
try:
with session_scope() as session:
user1 = User(name='David Lee', email='david.lee@example.com')
session.add(user1)
session.flush() # Saada muudatused andmebaasi, kuid Àra veel kinnita
# Loo salvestuspunkt
savepoint = session.begin_nested()
try:
user2 = User(name='Eve Wilson', email='eve.wilson@example.com')
session.add(user2)
session.flush()
# Simuleeri viga
raise ValueError("Simulated error during nested transaction")
except Exception as e:
print(f"Nested transaction error: {e}")
savepoint.rollback()
print("Nested transaction rolled back to savepoint.")
# JÀtka vÀlimise tehinguga, user1 lisatakse ikkagi
user3 = User(name='Frank Miller', email='frank.miller@example.com')
session.add(user3)
except Exception as e:
print(f"Outer transaction error: {e}")
# Kinnitamine kinnitab user1 ja user3, kuid mitte user2 pesastatud tagasivÔtmise tÔttu
try:
with session_scope() as session:
# Kontrolli, et eksisteerivad ainult user1 ja user3
users = session.query(User).all()
for user in users:
print(user)
except Exception as e:
print(f"Unexpected Exception: {e}") # Ei tohiks juhtuda
Selles nÀites:
- Alustame vÀlimist tehingut kasutades `session_scope()`.
- Lisame `user1` sessiooni ja teeme muudatustele `flush`-i andmebaasi. `flush()` saadab muudatused andmebaasi serverisse, kuid *ei* kinnita neid. See vÔimaldab teil nÀha, kas muudatused on kehtivad (nt piirangute rikkumisi pole) enne kogu tehingu kinnitamist.
- Loome salvestuspunkti kasutades `session.begin_nested()`.
- Pesastatud tehingu sees lisame `user2` ja simuleerime viga.
- VĂ”tame pesastatud tehingu tagasi salvestuspunkti kasutades `savepoint.rollback()`. See tĂŒhistab ainult pesastatud tehingu sees tehtud muudatused (st `user2` lisamise).
- JÀtkame vÀlimise tehinguga ja lisame `user3`.
- VÀlimine tehing kinnitatakse, salvestades `user1` ja `user3` andmebaasi, samas kui `user2` jÀetakse salvestuspunkti tagasivÔtmise tÔttu kÔrvale.
Isolatsioonitasemete kontrollimine
Isolatsioonitasemed mÀÀravad, mil mÀÀral on samaaegsed tehingud ĂŒksteisest isoleeritud. KĂ”rgemad isolatsioonitasemed pakuvad suuremat andmete jĂ€rjepidevust, kuid vĂ”ivad vĂ€hendada konkurentsi ja jĂ”udlust. SQLAlchemy vĂ”imaldab teil kontrollida oma tehingute isolatsioonitaset.
Levinud isolatsioonitasemed on jÀrgmised:
- Read Uncommitted (kinnitamata lugemine): Madalaim isolatsioonitase. Tehingud nÀevad teiste tehingute poolt tehtud kinnitamata muudatusi. See vÔib viia rÀpaste lugemisteni (dirty reads).
- Read Committed (kinnitatud lugemine): Tehingud nÀevad ainult teiste tehingute poolt tehtud kinnitatud muudatusi. See hoiab Àra rÀpased lugemised, kuid vÔib viia mittekorduvate lugemisteni (non-repeatable reads) ja fantoomlugemisteni (phantom reads).
- Repeatable Read (korratav lugemine): Tehingud nÀevad kogu tehingu vÀltel samu andmeid, isegi kui teised tehingud neid muudavad. See hoiab Àra rÀpased ja mittekorduvad lugemised, kuid vÔib viia fantoomlugemisteni.
- Serializable (serialiseeritav): KĂ”rgeim isolatsioonitase. Tehingud on ĂŒksteisest tĂ€ielikult isoleeritud. See hoiab Ă€ra rĂ€pased, mittekorduvad ja fantoomlugemised, kuid vĂ”ib oluliselt vĂ€hendada konkurentsi.
Vaikimisi isolatsioonitase sĂ”ltub andmebaasisĂŒsteemist. Saate mÀÀrata isolatsioonitaseme mootori loomisel vĂ”i tehingu alustamisel.
NĂ€ide (PostgreSQL):
from sqlalchemy.dialects.postgresql import dialect
# MÀÀra isolatsioonitase mootori loomisel
engine = create_engine('postgresql://user:password@host:port/database',
connect_args={'options': '-c statement_timeout=1000'} # NÀide ajalÔpust
)
# MÀÀra isolatsioonitase tehingu alustamisel (andmebaasispetsiifiline)
# PostgreSQL-i puhul on soovitatav see mÀÀrata ĂŒhendusele, mitte mootorile.
from sqlalchemy import event
from sqlalchemy.pool import Pool
@event.listens_for(Pool, "connect")
def set_isolation_level(dbapi_connection, connection_record):
existing_autocommit = dbapi_connection.autocommit
dbapi_connection.autocommit = True
cursor = dbapi_connection.cursor()
cursor.execute("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE")
dbapi_connection.autocommit = existing_autocommit
cursor.close()
# SeejÀrel kasutavad SQLAlchemy kaudu loodud tehingud konfigureeritud isolatsioonitaset.
TĂ€htis: Isolatsioonitasemete mÀÀramise meetod on andmebaasispetsiifiline. Ăige sĂŒntaksi leidmiseks vaadake oma andmebaasi dokumentatsiooni. Isolatsioonitasemete vale seadistamine vĂ”ib pĂ”hjustada ootamatut kĂ€itumist vĂ”i vigu.
Konkurentsi kÀsitlemine
Kui mitu kasutajat vĂ”i protsessi pÀÀsevad samadele andmetele samaaegselt juurde, on andmete rikkumise vĂ€ltimiseks ja andmete jĂ€rjepidevuse tagamiseks ĂŒlioluline konkurentsi Ă”igesti kĂ€sitleda. SQLAlchemy pakub mitmeid mehhanisme konkurentsi kĂ€sitlemiseks, sealhulgas optimistlikku ja pessimistlikku lukustamist.
Optimistlik lukustamine
Optimistlik lukustamine eeldab, et konfliktid on haruldased. See kontrollib enne tehingu kinnitamist teiste tehingute poolt tehtud muudatusi. Kui tuvastatakse konflikt, vÔetakse tehing tagasi.
Optimistliku lukustamise rakendamiseks lisate tavaliselt oma tabelisse versiooniveeru. Seda veergu suurendatakse automaatselt iga kord, kui rida uuendatakse.
from sqlalchemy import Column, Integer, String, Integer
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
content = Column(String)
version = Column(Integer, nullable=False, default=1)
def __repr__(self):
return f""
# try-catch ploki sees
def update_article(session, article_id, new_content):
article = session.query(Article).filter_by(id=article_id).first()
if article is None:
raise ValueError("Article not found")
original_version = article.version
# Uuenda sisu ja suurenda versiooni
article.content = new_content
article.version += 1
# Proovi uuendada, kontrollides versiooniveergu WHERE klauslis
rows_affected = session.query(Article).filter(
Article.id == article_id,
Article.version == original_version
).update({
Article.content: new_content,
Article.version: article.version
}, synchronize_session=False)
if rows_affected == 0:
session.rollback()
raise ValueError("Conflict: Article has been updated by another transaction.")
session.commit()
Selles nÀites:
- Lisame `Article` mudelile `version` veeru.
- Enne artikli uuendamist salvestame praeguse versiooninumbri.
- `UPDATE`-lauses lisame `WHERE`-klausli, mis kontrollib, kas versiooniveerg on endiselt vÔrdne salvestatud versiooninumbriga. `synchronize_session=False` takistab SQLAlchemy-l uuendatud objekti uuesti laadimast; me tegeleme versioonihaldusega ise.
- Kui versiooniveergu on muutnud teine tehing, ei mĂ”juta `UPDATE`-lause ĂŒhtegi rida (rows_affected on 0) ja me tekitame erandi.
- VÔtame tehingu tagasi ja teavitame kasutajat konflikti tekkimisest.
Pessimistlik lukustamine
Pessimistlik lukustamine eeldab, et konfliktid on tÔenÀolised. See omandab enne rea vÔi tabeli muutmist lukustuse. See takistab teistel tehingutel andmete muutmist, kuni lukustus vabastatakse.
SQLAlchemy pakub mitmeid funktsioone lukustuste omandamiseks, nÀiteks `with_for_update()`.
# NĂ€ide PostgreSQL-i kasutamisega
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
# Andmebaasi seadistus (asenda oma tegeliku andmebaasi URL-iga)
db_url = 'postgresql://user:password@host:port/database'
engine = create_engine(db_url, echo=False) # MÀÀra echo tÔeseks, kui soovid nÀha genereeritud SQL-i
Base = declarative_base()
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(String)
value = Column(Integer)
def __repr__(self):
return f"- "
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
# Funktsioon elemendi uuendamiseks (try/except sees)
def update_item_value(session, item_id, new_value):
# Omanda elemendile pessimistlik lukustus
item = session.query(Item).filter(Item.id == item_id).with_for_update().first()
if item is None:
raise ValueError("Item not found")
# Uuenda elemendi vÀÀrtust
item.value = new_value
session.commit()
return True
Selles nÀites:
- Kasutame `with_for_update()`, et omandada `Item` reale lukustus enne selle uuendamist. See takistab teistel tehingutel rea muutmist, kuni praegune tehing on kinnitatud vĂ”i tagasi vĂ”etud. Funktsioon `with_for_update()` on andmebaasispetsiifiline; ĂŒksikasjade saamiseks vaadake oma andmebaasi dokumentatsiooni. MĂ”nedel andmebaasidel vĂ”ivad olla erinevad lukustusmehhanismid vĂ”i sĂŒntaks.
TÀhtis: Pessimistlik lukustamine vÔib vÀhendada konkurentsi ja jÔudlust, seega kasutage seda ainult vajadusel.
Erinditöötluse parimad praktikad
NĂ”uetekohane erinditöötlus on andmete terviklikkuse tagamiseks ja rakenduste krahhide vĂ€ltimiseks ĂŒlioluline. Ămbritsege oma andmebaasioperatsioonid alati `try...except` plokkidega ja kĂ€sitlege erandeid asjakohaselt.
Siin on mÔned parimad praktikad erinditöötluseks:
- PĂŒĂŒdke spetsiifilisi erandeid: VĂ€ltige ĂŒldiste erandite, nagu `Exception`, pĂŒĂŒdmist. PĂŒĂŒdke spetsiifilisi erandeid, nagu `sqlalchemy.exc.IntegrityError` vĂ”i `sqlalchemy.exc.OperationalError`, et kĂ€sitleda erinevat tĂŒĂŒpi vigu erinevalt.
- VÔtke tehingud tagasi: VÔtke tehing alati tagasi, kui tekib erand.
- Logige erandid: Logige erandid, et aidata probleeme diagnoosida ja parandada. Lisage oma logidesse vÔimalikult palju konteksti (nt kasutaja ID, sisendandmed, ajatempel).
- TÔstke erandid uuesti sobival juhul: Kui te ei saa erandit kÀsitleda, tÔstke see uuesti, et kÔrgema taseme kÀsitleja saaks sellega tegeleda.
- Puhastage ressursid: Sulgege alati sessioon ja vabastage kÔik muud ressursid `finally` plokis.
import logging
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.exc import IntegrityError, OperationalError
# Seadista logimine
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Andmebaasi seadistus (asenda oma tegeliku andmebaasi URL-iga)
db_url = 'postgresql://user:password@host:port/database'
engine = create_engine(db_url, echo=False)
Base = declarative_base()
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
name = Column(String)
price = Column(Integer)
def __repr__(self):
return f""
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
# Funktsioon toote lisamiseks
def add_product(session, name, price):
try:
new_product = Product(name=name, price=price)
session.add(new_product)
session.commit()
logging.info(f"Product '{name}' added successfully.")
return True
except IntegrityError as e:
session.rollback()
logging.error(f"IntegrityError: {e}")
# KĂ€sitle andmebaasi piirangute rikkumisi (nt topeltnimi)
return False
except OperationalError as e:
session.rollback()
logging.error(f"OperationalError: {e}")
# KĂ€sitle ĂŒhenduse vigu vĂ”i muid operatiivseid probleeme
return False
except Exception as e:
session.rollback()
logging.exception(f"An unexpected error occurred: {e}")
# KĂ€sitle muid ootamatuid vigu
return False
finally:
session.close()
Selles nÀites:
- Seadistame logimise, et salvestada sĂŒndmusi protsessi kĂ€igus.
- PĂŒĂŒame spetsiifilisi erandeid nagu `IntegrityError` (piirangute rikkumiste jaoks) ja `OperationalError` (ĂŒhenduse vigade jaoks).
- VÔtame tehingu tagasi `except` plokkides.
- Logime erandid kasutades `logging` moodulit. Meetod `logging.exception()` lisab automaatselt logisÔnumile stack trace'i.
- TÔstame erandi uuesti, kui me ei saa seda kÀsitleda.
- Sulgeme sessiooni `finally` plokis.
AndmebaasiĂŒhenduste kogumine (Connection Pooling)
SQLAlchemy kasutab ĂŒhenduste kogumist (connection pooling), et andmebaasiĂŒhendusi tĂ”husalt hallata. Ăhenduste kogum hoiab andmebaasiga avatud ĂŒhenduste komplekti, vĂ”imaldades rakendustel taaskasutada olemasolevaid ĂŒhendusi uute loomise asemel iga pĂ€ringu jaoks. See vĂ”ib oluliselt parandada jĂ”udlust, eriti rakendustes, mis tegelevad suure hulga samaaegsete pĂ€ringutega.
SQLAlchemy `create_engine()` funktsioon loob automaatselt ĂŒhenduste kogumi. Saate konfigureerida ĂŒhenduste kogumit, edastades argumente `create_engine()` funktsioonile.
Levinud ĂŒhenduste kogumi parameetrid on jĂ€rgmised:
- pool_size: Maksimaalne ĂŒhenduste arv kogumis.
- max_overflow: Ăhenduste arv, mida saab luua ĂŒle `pool_size` piiri.
- pool_recycle: Sekundite arv, mille jĂ€rel ĂŒhendus taaskasutatakse.
- pool_timeout: Sekundite arv, mida oodatakse ĂŒhenduse vabanemist.
engine = create_engine('postgresql://user:password@host:port/database',
pool_size=5, # Maksimaalne kogumi suurus
max_overflow=10, # Maksimaalne ĂŒletĂ€itumine
pool_recycle=3600, # Taaskasuta ĂŒhendused 1 tunni pĂ€rast
pool_timeout=30
)
TĂ€htis: Valige sobivad ĂŒhenduste kogumi seaded vastavalt oma rakenduse vajadustele ja andmebaasiserveri vĂ”imekusele. Halvasti konfigureeritud ĂŒhenduste kogum vĂ”ib pĂ”hjustada jĂ”udlusprobleeme vĂ”i ĂŒhenduste ammendumist.
AsĂŒnkroonsed tehingud (Async SQLAlchemy)
Kaasaegsete rakenduste jaoks, mis nĂ”uavad suurt konkurentsi, eriti need, mis on ehitatud asĂŒnkroonsete raamistikega nagu FastAPI vĂ”i AsyncIO, pakub SQLAlchemy asĂŒnkroonset versiooni nimega Async SQLAlchemy.
Async SQLAlchemy pakub SQLAlchemy pĂ”hikomponentide asĂŒnkroonseid versioone, vĂ”imaldades teil teha andmebaasioperatsioone sĂŒndmuste ahelat blokeerimata. See vĂ”ib oluliselt parandada teie rakenduste jĂ”udlust ja skaleeritavust.
Siin on pÔhiline nÀide Async SQLAlchemy kasutamisest:
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String
import asyncio
# Andmebaasi seadistus (asenda oma tegeliku andmebaasi URL-iga)
db_url = 'postgresql+asyncpg://user:password@host:port/database'
engine = create_async_engine(db_url, echo=False)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
def __repr__(self):
return f""
async def create_db_and_tables():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async def add_user(name, email):
async with AsyncSession(engine) as session:
new_user = User(name=name, email=email)
session.add(new_user)
await session.commit()
async def main():
await create_db_and_tables()
await add_user("Async User", "async.user@example.com")
if __name__ == "__main__":
asyncio.run(main())
Peamised erinevused sĂŒnkroonsest SQLAlchemy-st:
- Kasutatakse `create_async_engine` funktsiooni `create_engine` asemel.
- Kasutatakse `AsyncSession` klassi `Session` asemel.
- KĂ”ik andmebaasioperatsioonid on asĂŒnkroonsed ja neid tuleb oodata kasutades `await`.
- Tuleb kasutada asĂŒnkroonseid andmebaasi draivereid (nt `asyncpg` PostgreSQL-i jaoks).
TĂ€htis: Async SQLAlchemy nĂ”uab andmebaasi draiverit, mis toetab asĂŒnkroonseid operatsioone. Veenduge, et teil on Ă”ige draiver installitud ja konfigureeritud.
KokkuvÔte
SQLAlchemy sessiooni- ja tehinguhalduse meisterlikkus on oluline robustsete ja usaldusvÀÀrsete Pythoni rakenduste loomiseks, mis suhtlevad andmebaasidega. MĂ”istes sessioonide, tehingute, isolatsioonitasemete ja konkurentsi kontseptsioone ning jĂ€rgides erinditöötluse ja ĂŒhenduste kogumise parimaid praktikaid, saate tagada andmete terviklikkuse ja optimeerida oma rakenduste jĂ”udlust.
Olenemata sellest, kas ehitate vĂ€ikest veebirakendust vĂ”i suuremahulist ettevĂ”tte sĂŒsteemi, pakub SQLAlchemy teile vajalikke tööriistu andmebaasi interaktsioonide tĂ”husaks haldamiseks. Pidage meeles, et alati tuleb eelistada andmete terviklikkust ja kĂ€sitleda vĂ”imalikke vigu sujuvalt, et tagada oma rakenduste usaldusvÀÀrsus.
Kaaluge edasijÔudnute teemade uurimist, nÀiteks:
- Kahefaasiline kinnitamine (2PC): Mitut andmebaasi hÔlmavate tehingute jaoks.
- Killustamine (Sharding): Andmete jaotamiseks mitme andmebaasiserveri vahel.
- Andmebaasi migratsioonid: Kasutades tööriistu nagu Alembic andmebaasi skeemimuudatuste haldamiseks.