Kapcsolatok kezelése az mssql-python használatával

A legtöbb alkalmazás egyszerű mintát követ: nyisson egy kapcsolatot, futtatja lekérdezéseket, zárja le a kapcsolatot. A következő részek a kapcsolatok megnyitását és zárását, kontextuskezelők használatát, az automatikus commit konfigurálását és a kapcsolat attribútumokkal való együttműködést tárgyalják.

Nyiss kapcsolatot

Használd a connect() függvényt a kapcsolat kialakításához. Adja meg a kiszolgálóhoz, az adatbázishoz és a hitelesítéshez tartozó adatokat tartalmazó kapcsolati karakterláncot:

import mssql_python

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;Database=<database>;"
    "Authentication=ActiveDirectoryDefault;Encrypt=yes"
)

A connect() függvény elfogadja:

  • Egy kapcsolati karakterlánc, mint az első pozíciós érv vagy connection_str kulcsszó.
  • Egyedi kulcsszavak, amelyeket az illesztőprogram a kapcsolati karakterlánc-be olvaszt.
  • Más lehetőségek, mint autocommit, timeout, és attrs_before.

Mindkét megközelítést kombinálhatod. A kulcsszavak felülírják az értékeket a kapcsolati karakterlánc-ben, ami hasznos, ha egy alap kapcsolati karakterlánc-et tárolsz konfigurációban és felülírási beállításokban, például timeout hívásonként:

# Base connection string from config, with per-call overrides
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;Database=<database>;"
    "Authentication=ActiveDirectoryDefault;Encrypt=yes",
    timeout=30,
    autocommit=True
)

Zárj le egy kapcsolatot

Mindig zárd le a kapcsolatokat, ha kész, hogy visszaadd őket a kapcsolati poolba, és felszabadítsd a szerver erőforrásait. A záratlan kapcsolatok szerveroldali memóriát tárolnak, és végül kimeríthetik a kapcsolati poolt, ami új csatlakozási próbálkozások blokkolását vagy sikertelenségét okozhatja.

conn = mssql_python.connect(connection_string)
try:
    # Use the connection
    cursor = conn.cursor()
    cursor.execute("SELECT 1")
finally:
    conn.close()

Ha lezárták, a kapcsolat nem használható:

conn.close()
print(conn.closed)  # True

# This raises an error
cursor = conn.cursor()  # InterfaceError: Cannot create cursor on closed connection

A(z) close() többszöri meghívása biztonságos (idempotens):

conn.close()
conn.close()  # No error

Környezetkezelők

A legtöbb alkalmazásban használd a with utasítást a kapcsolatok kezelésére. Garantálja, hogy az illesztőprogram lezárja a kapcsolatot a blokkból való kilépéskor, még akkor is, ha kivétel lép fel. Ez a megközelítés kiküszöböli az elfelejtett close() hívásokból eredő kapcsolatszivárgás kockázatát:

with mssql_python.connect(connection_string) as conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE #Demo (Name NVARCHAR(50))")
    cursor.execute("INSERT INTO #Demo (Name) VALUES ('Widget')")
    conn.commit()  # Must commit explicitly when autocommit=False
# Connection automatically closed

A kontextuskezelő kilépéskor lezárja a kapcsolatot. Nem véglegesíti vagy vonja vissza automatikusan a tranzakciókat:

  • Mindig: Meghívja a(z) close() elemet kilépéskor, attól függetlenül, hogy történt-e kivétel.
  • close() viselkedés: Ha autocommit=False, minden el nem kötelezett változtatást visszavonnak a kapcsolat zárásakor.
  • Kifejezetten kell hívnod conn.commit() a változások fenntartásához.

Ez a kialakítás a PEP 249 viselkedését követi, és megakadályozza a véletlen részleges elköteleződéseket. Ha a kódod kivételt dob, mielőtt elérné a commit() elemet, a folyamatban lévő tranzakció biztonságosan visszagörgetésre kerül:

# Equivalent manual code:
conn = mssql_python.connect(connection_string)
try:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE #Demo (Name NVARCHAR(50))")
    cursor.execute("INSERT INTO #Demo (Name) VALUES ('Widget')")
    conn.commit()  # Must commit explicitly
finally:
    conn.close()  # Rolls back uncommitted changes if autocommit=False

Automatikus véglegesítési mód

Alapértelmezettben, autocommit=False, ami azt jelenti, hogy minden állítás egy implicit tranzakción belül fut. A módosítások mentéséhez meg kell hívnod a conn.commit() elemet, az elvetésükhöz pedig a conn.rollback() elemet. Az implicit tranzakciók a legbiztonságosabb választás adatmódosításokhoz, mert lehetővé teszik, hogy több állítást egyetlen atomi műveletbe csoportosítsunk.

Kapcsold be az automatikus véglegesítést, ha azt szeretnéd, hogy minden utasítás azonnal véglegesítve legyen. Az automatikus commitálás hasznos DDL műveletekhez (CREATE TABLE, ALTER INDEX), csak olvasható munkaterhelésekhez vagy adminisztratív szkriptekhez, ahol tranzakciócsoportosítás nem szükséges:

conn = mssql_python.connect(connection_string)
print(conn.autocommit)  # False

cursor = conn.cursor()
cursor.execute("CREATE TABLE #Demo (Name NVARCHAR(50))")
cursor.execute("INSERT INTO #Demo (Name) VALUES ('Widget')")
conn.commit()  # Required to persist changes

Engedélyezze az automatikus véglegesítést, hogy minden utasítás azonnal véglegesüljön. Használd a(z) autocommit=True beállítást csatlakozáskor, vagy csatlakozás után váltsd át a(z) setautocommit() használatával vagy közvetlen tulajdonságbeállítással:

# At connection time
conn = mssql_python.connect(connection_string, autocommit=True)

# Or after connection (both forms work)
conn.setautocommit(True)
conn.autocommit = True
print(conn.autocommit)  # True

# Now changes are committed automatically
cursor = conn.cursor()
cursor.execute("SELECT TOP 1 Name FROM Production.Product")
print(cursor.fetchone().Name)
# No commit() needed

Kapcsolati időkorlát

Állítsd be a kapcsolati időkorlátot annak szabályozására, hogy a meghajtó mennyi ideig várjon a kapcsolat létrehozására, mielőtt hibát jelez. Egy ésszerű kapcsolati időkorlát fontos olyan alkalmazások esetében, amelyeket megbízhatatlan hálózatok környezetében telepítenek, vagy ha gyorsan meghibásodnak, amikor egy szerver elérhetetlen:

# At connection time (in seconds)
conn = mssql_python.connect(connection_string, timeout=30)

# Or after connection
conn.timeout = 60
print(conn.timeout)  # 60

A(z) 0 időkorlát azt jelenti, hogy nincs időkorlát (korlátlan ideig vár). Állítson be észszerű időkorlátokat éles környezetben; egy időkorlát nélküli, elakadt kapcsolódási kísérlet végleg blokkolja a hívó szálat.

Kapcsolati attribútumok

Használd set_attr() a kapcsolati viselkedés módosítására futásidőben. A kapcsolati attribútumok szabályozzák az alacsony szintű illesztőprogram-beállításokat, mint például a hozzáférési mód, a tranzakció izolálása és a csomagméret. A legtöbb alkalmazásnak nem kell ezeket az attribútumokat megváltoztatnia, de hasznosak bizonyos helyzetekben:

  • Csak olvasható mód: Megakadályozza a véletlen írásokat a lekérdezések jelentésekor.
  • Tranzakciós izoláció: Szabályozza, hogyan lépnek kölcsönhatásba az egyidejű tranzakciók ( SERIALIZABLE szigorú konzisztenciáért, READ_COMMITTED általános használatra).
  • Csomagméret: Magas késleltetésű vagy nagy átviteli teljesítményű hálózatokhoz igazítható.
import mssql_python

conn = mssql_python.connect(connection_string)

# Set read-only mode
conn.set_attr(mssql_python.SQL_ATTR_ACCESS_MODE, mssql_python.SQL_MODE_READ_ONLY)

# Set transaction isolation level
conn.set_attr(mssql_python.SQL_ATTR_TXN_ISOLATION, mssql_python.SQL_TXN_SERIALIZABLE)

Elérhető tulajdonságok:

Konstans Leírás
SQL_ATTR_CONNECTION_TIMEOUT A kapcsolat időtúllépése másodpercben.
SQL_ATTR_LOGIN_TIMEOUT A bejelentkezés időkorlátja másodpercben.
SQL_ATTR_PACKET_SIZE Hálózati csomag mérete.
SQL_ATTR_ACCESS_MODE Csak olvasható vagy olvasás-írás mód.
SQL_ATTR_TXN_ISOLATION Tranzakciós izolációs szint.
SQL_ATTR_CURRENT_CATALOG Jelenlegi adatbázis neve.

Előcsatlakozási attribútumok

Néhány attribútumot be kell állítani, mielőtt a meghajtó létrehozná a kapcsolatot (például bejelentkezési időtúllépés). Vezesd át őket attrs_before:

conn = mssql_python.connect(
    connection_string,
    attrs_before={
        mssql_python.SQL_ATTR_LOGIN_TIMEOUT: 30,
        mssql_python.SQL_ATTR_CONNECTION_TIMEOUT: 60,
    }
)

Kapcsolatadatok lekérése

Használat getinfo() illesztő- és szervermetaadatok lekérésére naplózáshoz, diagnosztikához vagy a szerver képességei alapján történő viselkedés adaptálásához:

conn = mssql_python.connect(connection_string)

# Server information
print(f"Server name: {conn.getinfo(mssql_python.SQL_SERVER_NAME)}")
print(f"Database name: {conn.getinfo(mssql_python.SQL_DATABASE_NAME)}")

# Driver information
print(f"Driver name: {conn.getinfo(mssql_python.SQL_DRIVER_NAME)}")
print(f"Driver version: {conn.getinfo(mssql_python.SQL_DRIVER_VER)}")

Szerezz egy listát az elérhető információs állandókról:

constants = mssql_python.get_info_constants()
for name, value in constants.items():
    print(f"{name}: {value}")

Escape-karakter keresése

A searchescape tulajdonság azt a karaktert adja vissza, amely a LIKE mintákban a helyettesítő karakterek (% és _) escape-elésére szolgál. Használd arra, hogy biztonságosan kereshess szó szerinti helyettesítő karaktereket a felhasználói bemenetben:

escape = conn.searchescape

# Use in queries with wildcard characters
cursor.execute(
    f"SELECT Name FROM Production.Product WHERE Name LIKE '%{escape}%%' ESCAPE '{escape}'"
)
# Matches names containing literal '%' character

Kódolás és dekódolás

Konfiguráld be a szövegkódolást SQL utasításokhoz és eredményekhez. Az alapértelmezett beállítások a legtöbb alkalmazásnál működnek. Csak akkor változtassa meg őket, ha olyan szerverhez csatlakozol, amely nem UTF-8 kódolást használ az char/varchar oszlopokhoz. A szerver által használt kódolás az oszlop összeállításától függ:

# Set encoding for outbound text
conn.setencoding(encoding='utf-8')

# Get current encoding settings
settings = conn.getencoding()
print(settings)  # {'encoding': 'utf-8', 'ctype': ...}

# Set decoding for inbound text from specific SQL types
conn.setdecoding(mssql_python.SQL_CHAR, encoding='utf-8')

# Get current decoding settings
settings = conn.getdecoding(mssql_python.SQL_CHAR)
print(settings)

Alapértelmezett kódolások:

Irány SQL-típus Alapértelmezett kódolás
Kimenő (str) SQL_WCHAR utf-16le
Bejövő SQL_CHAR utf-8
Bejövő SQL_WCHAR utf-16le
Bejövő SQL_WMETADATA utf-16le

Bevált gyakorlatok

  • Használj kontextuskezelőket (with blokkokat) az alkalmazáskód összes kapcsolatához. Garantálják a takarítást még akkor is, ha kivételek adódnak.
  • Használj kapcsolati poolinget jobb teljesítményért (alapértelmezetten engedélyezve). Lásd: kapcsolatcsoportosítás.
  • Állíts be megfelelő időkorlátokat a hálózati környezetedhez. A 30 másodperces időkorlát a legtöbb felhőtelepítéshez megfelelő; Növeld a tartományi vagy VPN kapcsolatok esetén.
  • Használja a(z) autocommit=False beállítást (ez az alapértelmezett) olyan adatmódosítási forgatókönyvekhez, ahol tranzakcionális atomitásra van szükség.
  • Használat autocommit=True DDL műveletekhez, csak olvasható lekérdezésekhez és admin szkriptekhez.
  • Ne oszd meg a kapcsolatokat a szálak között. A meghajtó szál biztonsági szintje 1 (a szálak megoszthatják a modult, de a csatlakozásokat nem).