mssql-python a Microsoft Python-illesztőprogramja az SQL Serverhez, az Azure SQL Database-hez, az Azure SQL Managed Instance-hez és a Microsoft Fabric SQL-adatbázisához. Közvetlen adatbázis-kapcsolatot (DDBC) használ, így csatlakozhatsz anélkül, hogy külső driver manager telepítenéd. A meghajtó támogatja a Python 3.10-et vagy újabb verziókat, és megfelel a Python Database API Specification 2.0-nak, miközben Python-barát fejlesztéseket ad a mindennapi fejlesztéshez.
Válassza ki a kiindulási pontot
Azure SQL üzemi alapkonfigurációja
Ezt a mintát használd kiindulópontként egy termelésorientált Azure SQL kapcsolathoz. A környezet konfigurációit olvassa fel, menedzselt identitással autentikál, és lehetővé teszi a Tabular Data Stream (TDS) 8.0 titkosítást. Emellett beállítja a bejelentkezési és kijelentésenkénti lekérdezési időkorlátokat, újrapróbálja az átmeneti hibákat exponenciális visszacsatolással (egy friss kapcsolat a kapcsolati hibák esetén, ugyanaz a kapcsolat lekérdezési hibáknál, mint a holtpont esetén), naplózi az eredményeket, és kontextuskezelőkre támaszkodik az erőforrások felszabadítására.
A kapcsolati karakterláncban szereplő ConnectRetryCount és ConnectRetryInterval kulcsszavak lehetővé teszik az SQL Server inaktív kapcsolatokkal szembeni rugalmasságát: az illesztőprogram automatikusan újracsatlakozik egy megszakadt inaktív kapcsolathoz. Ez eltér az alkalmazásszintű újrapróbálkozástól ebben a mintában, amely újrapróbálja a meghibásodott lekérdezést, például holtpont vagy lekérdezési időkérés esetén. A kettő kiegészítő jellegű, szóval mindkettőt tartsd meg.
import logging
import os
import time
import mssql_python
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s %(message)s",
)
logger = logging.getLogger("app")
# Transient errors that require a fresh connection to recover.
CONNECT_RETRY_ERRORS = frozenset({
"Timeout expired",
"Connection timeout expired",
"Client unable to establish connection",
"Communication link failure",
"Connection failure during transaction",
})
# Transient errors that leave the connection usable, such as a deadlock victim
# or a query timeout, so retry on the same connection.
QUERY_RETRY_ERRORS = frozenset({
"Serialization failure",
"Timeout expired",
})
def connect_with_retry(conn_str: str, max_attempts: int = 3, login_timeout_s: int = 5) -> mssql_python.Connection:
"""Open a connection, retrying transient failures with exponential backoff."""
for attempt in range(1, max_attempts + 1):
try:
conn = mssql_python.connect(
conn_str,
attrs_before={mssql_python.SQL_ATTR_LOGIN_TIMEOUT: login_timeout_s},
)
logger.info("connected on attempt %d/%d", attempt, max_attempts)
return conn
except mssql_python.OperationalError as exc:
if exc.driver_error not in CONNECT_RETRY_ERRORS or attempt == max_attempts:
logger.error("connect failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
raise
delay = 2 ** (attempt - 1) # 1s, 2s, 4s
logger.warning(
"connect attempt %d/%d hit transient error %r; retrying in %ds",
attempt, max_attempts, exc.driver_error, delay,
)
time.sleep(delay)
def execute_with_retry(
conn: mssql_python.Connection,
sql: str,
*params,
max_attempts: int = 3,
query_timeout_s: int = 10,
) -> mssql_python.Cursor:
"""Run sql on an open connection and return the ready-to-fetch cursor.
Retries errors that leave the connection usable so callers don't wrap each
query in its own function. Pass query values as parameters. Retry only
idempotent statements; wrap writes in an explicit transaction.
"""
for attempt in range(1, max_attempts + 1):
cursor = mssql_python.Cursor(conn, timeout=query_timeout_s)
try:
cursor.execute(sql, *params)
if attempt > 1:
logger.info("query succeeded on attempt %d/%d", attempt, max_attempts)
return cursor
except mssql_python.OperationalError as exc:
cursor.close()
if exc.driver_error not in QUERY_RETRY_ERRORS or attempt == max_attempts:
logger.error("query failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
raise
delay = 2 ** (attempt - 1) # 1s, 2s, 4s
logger.warning(
"query attempt %d/%d hit transient error %r; retrying in %ds",
attempt, max_attempts, exc.driver_error, delay,
)
time.sleep(delay)
raise RuntimeError("unreachable: the retry loop exits by return or raise")
def main() -> None:
# Read configuration from the environment; never hard-code secrets.
server = os.environ["SQL_SERVER"] # for example, myserver.database.windows.net
database = os.environ["SQL_DATABASE"] # for example, AdventureWorks
client_id = os.getenv("AZURE_CLIENT_ID") # set for a user-assigned managed identity
# Authenticate with the workload's managed identity over TDS 8.0 encryption.
# ConnectRetryCount/ConnectRetryInterval transparently reconnect a dropped
# idle connection; they don't replay a failed query.
conn_str = (
f"Server={server};"
f"Database={database};"
"Authentication=ActiveDirectoryMsi;"
"Encrypt=strict;"
"ConnectRetryCount=3;"
"ConnectRetryInterval=10;"
)
if client_id:
conn_str += f"UID={client_id};"
query = """
SELECT TOP 10
p.BusinessEntityID,
p.FirstName,
p.LastName
FROM Person.Person AS p
ORDER BY p.BusinessEntityID;
"""
try:
# Context managers close the cursor and connection automatically.
with connect_with_retry(conn_str) as conn:
with execute_with_retry(conn, query) as cursor:
for business_entity_id, first_name, last_name in cursor.fetchall():
print(f"{business_entity_id}\t{first_name}\t{last_name}")
except mssql_python.Error:
logger.exception("query failed")
raise
if __name__ == "__main__":
main()
A mintavételben található problémák részletesebb útmutatásáért lásd Microsoft Entra hitelesítést, kapcsolati poolinget, titkosítást és tanúsítványokat, újrapróbálkozási logikát és hibakezelést.
Legfontosabb funkciók
-
PEP 249-kompatibilitás: A szabványos
connect, cursor, execute és fetch* interfészek, valamint Pythonos kiterjesztések.
-
Közvetlen adatbázis-kapcsolat (DDBC): Nem szükséges külső driver manager. Telepítsd
mssql-python be, és készen állsz a csatlakozásra.
-
Microsoft Entra ID hitelesítés: Beépített támogatás az autentifikációs módokhoz, beleértve a menedzselt identitásokat és szolgáltatáselveket.
-
SQL Server és Windows authentication: SQL bejelentkezések, Kerberos és Windows single sign-on (SSO) támogatott platformokon.
-
Tömeges másolás: Nagy teljesítményű tömeges beszúrás nagy adatmennyiségek betöltéséhez, natív TDS-protokoll támogatásával.
-
Natív adattípusok támogatása: JSON, XML, térbeli oszlopok, datetimeoffset és tizedes/pénz pontosan kezelhető.
-
Apache Arrow integráció: Zero-copy eredményhalmazok gyors adatcseréhez pandas, Polars és DuckDB között.
-
Aszinkron működési minták: Az illesztőprogram használata
asyncio-alapú alkalmazásokkal és FastAPI-val ThreadPoolExecutor-alapú kerülőmegoldásokkal. Lásd az aszinkron mintákat az integrációs mintákért.
-
TLS alapértelmezettben: TLS titkosítás és tanúsítvány ellenőrzése alapértelmezetten bekapcsolva (ODBC Driver 18-on keresztül). TDS 8.0 titkosítás elérhető, ha beállítod
Encrypt=strict.
Első lépések
Adatkezelés
| Cikk |
Leírás |
|
Lekérdezések végrehajtása |
execute, executemany, több utasításból álló kötegek és eredményhalmazok. |
|
Adatok visszakeresése |
fetchone, fetchmany, fetchall és streamelési minták. |
|
Paraméteres lekérdezések |
Biztonságosan kötni a paramétereket, hogy elkerüld az SQL befecskendezését. |
|
Tárolt eljárások |
Hívd meg az eljárásokat, olvasd el a kimeneti paramétereket és feldolgozza az eredményhalmazokat. |
|
Kurzor kezelés |
Kurzorok élettartama, görgetés és a tömbméret finomhangolása. |
|
Sorobjektumok |
A sorokhoz index, név vagy leképezések alapján lehet hozzáférni. |
|
Tranzakciókezelés |
Kötelezés, visszagörgetés, mentési pontok és izolációs szintek. |
|
Tördelés |
Kulcskészletes és eltolásos lapozási minták nagy eredményhalmazok esetén. |
|
Hibakezelés |
mssql_python.Error, DatabaseError, és SQL Server hibaszerkezete. |
|
Újrapróbálkozási logika |
Észleld az átmeneti hibákat, és próbáld újra exponenciális visszalépéssel. |
SQL Server adattípusok és funkciók
| Cikk |
Leírás |
|
Adattípus-leképezések |
SQL Server-to-Python típusú tábla és átalakítási szabályok. |
|
Dátumidőkezelés |
datetime, datetime2, datetimeoffset, , és időzóna szempontok. |
|
Tizedes és pénztípusok |
Pontos numerikus típusok és decimal.Decimal pontosság. |
|
String és Unicode adatok |
varchar, nvarchar, összeállítások és kódoldalak. |
|
NULL kezelése |
Háromértékű logika, őrök és pandák egymás között működnek. |
|
Bináris adatok |
varbinary, image, és nagyméretű objektumok streamelése. |
|
Egyedi típusú átalakítók |
Regisztrálja az egyedi típusokhoz tartozó bemeneti és kimeneti konvertereket. |
|
Tömeges másolási műveletek |
Nagy átviteli sebességű beszúrások a tömeges másolási API-val. |
|
JSON adatok |
Tárolja, kérdezze le és darabolja fel a JSON-adatokat a FOR JSON és OPENJSON segítségével. |
|
XML adatok |
Dolgozz az xml adattípussal, az XPath-tal és az XQuery-vel. |
|
Térbeli adatok |
geometryés geography a Python-ból származó típusok. |
|
Takarékos oszlopok |
Ritka oszlopok és oszlopkészletek széles asztalokhoz. |
|
Sémafelderítés |
Adatbázisokat, táblákat, oszlopokat és indexeket vizsgálja. |
| Cikk |
Leírás |
|
Apache Arrow integráció |
Az eredmények lekérése Arrow-táblák formájában másolás nélküli elemzéshez. |
|
pandas-integráció |
Töltsd be a lekérdezési eredményeket a DataFrame-be, és írd vissza őket. |
|
Polars-integráció |
Használd a Polars-t mssql-python-szal columnáris munkaterhelésekhez. |
|
DuckDB integráció |
Kérdezze le az SQL Server adatait a helyi DuckDB-táblákkal együtt. |
|
FastAPI integráció |
Integráld a mssql-pythont a FastAPI-szolgáltatásokba. |
|
Flaskos integráció |
Használj mssql-pythont a Flask alkalmazásokban. |
|
Aszinkron minták |
Kombináld az mssql-pythont a asyncio thread poolokkal. |
|
Adathozzáférés és elemzési minták |
Válaszd ki a megfelelő beolvasási módot a kurzorhozzáféréshez, az Arrow-adatkinyeréshez, valamint a pandas-, Polars- és DuckDB-elemzéshez SQL-adatokon. |
|
Adatbetöltés és mozgási minták |
Válassza ki a megfelelő írási módot sorbeszúrásokhoz, tömeges másoláshoz, MERGE upsert műveletekhez, DataFrame-ek betöltéséhez és CSV-fájlok beolvasásához. |
Üzembe helyezés és üzemeltetés
Migrálás erre: mssql-python
Hivatkozás
| Cikk |
Leírás |
|
Támogatási életciklus |
Támogattam a Python és SQL Server verziókat, valamint frissítési ütemet. |
|
Újdonságok |
Verzióelőzmények és kiadási kiemelések. |
Kapcsolódó tartalom