Nastavení modulu mssql-python

Ovladač mssql-python poskytuje třídu Settings , která řídí chování v celém modulu. Tato nastavení ovlivňují všechna spojení a operace kurzoru. Nakonfigurujte je jednou při spuštění aplikace, než vytvoříte jakékoliv připojení.

Nastavení přístupu

Získejte aktuální Settings objekt a zkontrolujte nebo upravte jeho vlastnosti:

import mssql_python

# Get settings object
settings = mssql_python.get_settings()

# Check current values
print(settings.lowercase)
print(settings.decimal_separator)

Dostupná nastavení

Následující nastavení určují, jak ovladač vrací data a formátuje výsledky.

malá písmena

Nastavení lowercase určuje, zda se názvy sloupců v cursor.description zobrazují malými písmeny. Toto nastavení zapněte, pokud vaše aplikace přistupuje ke sloupcům podle názvu a chcete se vyhnout nesouladu ve velikosti písmen. Webové frameworky jako Flask a FastAPI často převádějí řádky na slovníky, což činí konzistentní slovní písmo důležitým:

settings = mssql_python.get_settings()

# Enable lowercase column names (default: False)
settings.lowercase = True

# Column names in cursor.description are now lowercased:
# ('productid', ...) instead of ('ProductID', ...)
Hodnota Popis
False Výchozí. Názvy sloupců zachovávají původní kryt.
True Názvy sloupců v cursor.description se převádějí na malá písmena.

Desetinný oddělovač

Ovladač poskytuje funkce na úrovni modulu pro řízení desetinného oddělovače pro číselné převody. Toto nastavení změňte pouze pokud vaše instance SQL Server používá lokalitu s čárkou jako desetinným oddělovačem, například francouzské nebo německé lokality. Většina aplikací toto nastavení nezmění:

import mssql_python

# Get current separator
sep = mssql_python.getDecimalSeparator()
print(f"Current separator: {sep}")  # Usually "."

# Set custom separator (for locales using comma)
mssql_python.setDecimalSeparator(",")

Pro více informací o manipulaci s desetinnými čísly viz mapování datových typů.

native_uuid

Nastavení native_uuid určuje, zda se sloupce UNIQUEIDENTIFIER vracejí jako objekty Python uuid.UUID, nebo jako řetězce kompatibilní s pyodbc psané velkými písmeny. Toto nastavení je užitečné pro týmy přecházející z pyodbc, které závisejí na hodnotách UUID ve formě řetězce:

settings = mssql_python.get_settings()

# Return UUIDs as uuid.UUID objects (default: True)
settings.native_uuid = True

# Return UUIDs as uppercase strings (pyodbc-compatible)
settings.native_uuid = False
Hodnota Popis
True Výchozí. UNIQUEIDENTIFIER sloupce vracejí uuid.UUID objekty.
False UNIQUEIDENTIFIER Sloupce vracejí řetězce psané velkými písmeny (kompatibilní s pyodbc).

Můžete také nastavit native_uuid pro každé připojení:

# Override for a specific connection
conn = mssql_python.connect(connection_string, native_uuid=False)

Note

Toto native_uuid nastavení bylo zavedeno ve verzi mssql-python 1.5.0.

Konstanty na úrovni modulů

Ovladač zpřístupňuje konstanty kompatibility DB-API 2.0 jen pro čtení, které popisují jeho schopnosti. Použijte tyto konstanty k napsání kódu, který se přizpůsobuje různým DB-API ovladačům:

import mssql_python

# DB-API 2.0 compliance level
print(mssql_python.apilevel)      # '2.0'

# Thread safety level
print(mssql_python.threadsafety)  # 1

# Parameter style
print(mssql_python.paramstyle)    # 'pyformat'

Apilevel

Konstanta apilevel uvádí DB-API úroveň souladu:

Hodnota Význam
'2.0' Plný soulad s DB-API 2.0.

Bezpečnost závitů

Konstanta hlásí threadsafety úroveň bezpečnosti vláken:

Hodnota Význam
0 Vlákna nemohou sdílet modul.
1 Vlákna mohou sdílet modul, ale ne připojení.
2 Vlákna mohou sdílet modul a připojení.
3 Vlákna mohou sdílet stejný modul, připojení a kurzory.

Ovladač mssql-python používá threadsafety = 1, což znamená:

  • Modul můžete importovat a používat napříč vlákny.
  • Každé spojení musí patřit pouze jednomu vláknu najednou.
  • Vytvořte samostatné spojení pro každé vlákno, nebo použijte pool připojení (ve výchozím nastavení povolený). Pro více informací viz Sdružování připojení.

ParamStyle

Konstanta paramstyle hlásí formát zástupného parametru:

Style Format Příklad
'qmark' Otazníky WHERE id = ?
'numeric' Číselná pozice WHERE id = :1
'named' Pojmenovaný WHERE id = :id
'format' ANSI C printf WHERE id = %s
'pyformat' Python formát WHERE id = %(id)s

Ovladač mssql-python používá paramstyle = 'pyformat'. Vždy používejte pojmenované parametry, abyste zabránili SQL injection. Nikdy nevytvářejte dotazy s uživatelským vstupem pomocí formátování řetězců nebo f-stringů:

# Use named parameters with %(name)s syntax
cursor.execute(
    "SELECT * FROM Production.Product WHERE ProductSubcategoryID = %(cat)s AND ListPrice > %(price)s",
    {"cat": 5, "price": 10.00}
)

Informace o verzi

Zkontrolujte, která verze ovladače je nainstalovaná:

import mssql_python

# Driver version
print(mssql_python.__version__)  # e.g., '1.5.0'

Nastavte nastavení při spuštění

Nastavte konfiguraci modulu při spuštění aplikace, než vytvoříte jakékoliv připojení. Včasné nastavení hodnot zabraňuje nekonzistentnímu chování napříč spojeními:

import mssql_python

def configure_driver():
    """Configure mssql-python settings for this application."""
    settings = mssql_python.get_settings()
    
    # Use lowercase column names in cursor.description
    settings.lowercase = True

# Call at application startup
configure_driver()

# All subsequent connections use these settings
conn = mssql_python.connect(connection_string)

Bezpečnostní aspekty závitu

Nastavení modulu je globální a ovlivňuje všechna připojení ve všech vláknech. Pokud změníte nastavení poté, co jsou připojení již otevřená, stávající spojení nemusí tuto změnu konzistentně odrážet. Nastavte všechny konfigurační hodnoty před vytvořením prvního připojení:

import mssql_python
import threading

# Settings changes affect all threads
settings = mssql_python.get_settings()
settings.lowercase = True  # Affects all connections in all threads

def worker():
    # This connection uses the global settings
    conn = mssql_python.connect(connection_string)
    cursor = conn.cursor()
    cursor.execute("SELECT Name FROM Production.Product")
    row = cursor.fetchone()
    print(cursor.description[0][0])  # 'name' due to global setting

threads = [threading.Thread(target=worker) for _ in range(5)]
for t in threads:
    t.start()
for t in threads:
    t.join()

Important

Před vytvořením připojení nastavte nastavení. Změna nastavení po vytvoření spojení může vést k nekonzistentnímu chování.

Konfigurace specifická pro spojení

Některé nastavení můžete přepsat pro každé připojení, aniž byste měnili globální výchozí nastavení. Používejte přepsání pro jednotlivé spojení, když různé části vaší aplikace potřebují odlišné chování. Například modul pro reportování může potřebovat řetězcové UUID, zatímco zbytek aplikace používá uuid.UUID objekty:

# Per-connection native_uuid override
conn = mssql_python.connect(connection_string, native_uuid=False)

# Use the autocommit property
conn.autocommit = True