Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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_strkulcsszó. - Egyedi kulcsszavak, amelyeket az illesztőprogram a kapcsolati karakterlánc-be olvaszt.
- Más lehetőségek, mint
autocommit,timeout, ésattrs_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: Haautocommit=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 (
SERIALIZABLEszigorú 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 (
withblokkokat) 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=Falsebeá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=TrueDDL 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).