Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Många applikationer behöver bygga anslutningssträngar dynamiskt istället för att lagra dem som statiska konfigurationsvärden. Välj det tillvägagångssätt som passar din utplacering:
- Miljövariabler: Bäst för containrar, CI/CD och 12-faktorsappar. Enkelt och med brett stöd.
- JSON/YAML-konfigurationsfiler: Bäst för applikationer med flera miljöer (utveckling, staging, produktion) som behöver strukturerad konfiguration.
- Azure Key Vault: Bäst för produktionsdistributioner där hemligheter måste hanteras och granskas centralt.
- Builder-klass: Bäst för bibliotek eller ramverk som behöver konstruera anslutningssträngar från användarinmatning med automatisk escape.
Grundläggande strängkonstruktion
Använd f-strängar
F-strängar är en vanlig metod för snabba skript och prototyper. Undvik detta mönster när värden kommer från användarinmatning, eftersom ett skadligt värde som mydb;Server=evil.com kan ändra anslutningsmålet:
import mssql_python
server = "<server>.database.windows.net"
database = "<database>"
connection_string = f"Server={server};Database={database};Authentication=ActiveDirectoryDefault;Encrypt=yes;"
conn = mssql_python.connect(connection_string)
Använd join
Metoden join separerar nyckel-värdepar i ett ordboksliknande funktionsanrop, vilket är lättare att läsa och underhålla än en lång f-sträng. Den filtrerar också automatiskt bort None värden, så du kan skicka valfria parametrar utan extra villkorlig logik:
def build_connection_string(**kwargs) -> str:
"""Build connection string from keyword arguments."""
return ";".join(f"{key}={value}" for key, value in kwargs.items() if value is not None)
conn_str = build_connection_string(
Server="<server>.database.windows.net",
Database="<database>",
Authentication="ActiveDirectoryDefault",
Encrypt="yes"
)
conn = mssql_python.connect(conn_str)
Anslutningssträngbyggarklass
En builder-klass tillhandahåller ett flytande API med automatisk utrymning. Denna metod är användbar i bibliotek eller multitenant-applikationer där anslutningsparametrar kommer från olika källor:
import mssql_python
class ConnectionStringBuilder:
"""Builder for SQL Server connection strings."""
def __init__(self):
self._params = {}
def server(self, value: str) -> "ConnectionStringBuilder":
self._params["Server"] = value
return self
def database(self, value: str) -> "ConnectionStringBuilder":
self._params["Database"] = value
return self
def trusted_connection(self) -> "ConnectionStringBuilder":
self._params["Trusted_Connection"] = "yes"
return self
def sql_auth(self, username: str, password: str) -> "ConnectionStringBuilder":
self._params["UID"] = username
self._params["PWD"] = password
return self
def entra_default(self) -> "ConnectionStringBuilder":
self._params["Authentication"] = "ActiveDirectoryDefault"
return self
def entra_msi(self, client_id: str = None) -> "ConnectionStringBuilder":
self._params["Authentication"] = "ActiveDirectoryMSI"
if client_id:
self._params["UID"] = client_id
return self
def encrypt(self, value: bool = True) -> "ConnectionStringBuilder":
self._params["Encrypt"] = "yes" if value else "no"
return self
def trust_server_certificate(self, value: bool = True) -> "ConnectionStringBuilder":
self._params["TrustServerCertificate"] = "yes" if value else "no"
return self
def connect_timeout(self, seconds: int) -> "ConnectionStringBuilder":
self._timeout = seconds
return self
def build(self) -> str:
"""Build the connection string."""
return ";".join(f"{k}={v}" for k, v in self._params.items())
def connect(self) -> mssql_python.Connection:
"""Build and connect."""
return mssql_python.connect(self.build(), timeout=getattr(self, '_timeout', 0))
# Usage examples
# Microsoft Entra authentication (recommended)
conn = (ConnectionStringBuilder()
.server("<server>.database.windows.net")
.database("<database>")
.entra_default()
.encrypt()
.connect())
# Azure with managed identity
conn = (ConnectionStringBuilder()
.server("<server>.database.windows.net")
.database("<database>")
.entra_msi()
.encrypt()
.connect())
Miljöbaserad konfiguration
Från miljövariabler
Att läsa anslutningsparametrar från miljövariabler håller inloggningsuppgifter utanför källkoden och fungerar över lokal utveckling, containrar och CI/CD-pipelines. Funktionen kontrollerar vilken autentiseringsmetod som ska användas baserat på de variabler som är satta:
import os
import mssql_python
def get_connection_from_env() -> mssql_python.Connection:
"""Build connection from environment variables."""
server = os.environ.get("SQL_SERVER")
database = os.environ.get("SQL_DATABASE")
if not server or not database:
raise ValueError("SQL_SERVER and SQL_DATABASE environment variables required")
# Check for authentication method
if os.environ.get("SQL_USE_MSI", "").lower() == "true":
# Azure Managed Identity
conn_str = f"Server={server};Database={database};Authentication=ActiveDirectoryMSI;Encrypt=yes;"
elif os.environ.get("SQL_TRUSTED_CONNECTION", "").lower() == "true":
# Windows authentication
conn_str = f"Server={server};Database={database};Trusted_Connection=yes;Encrypt=yes;"
else:
# SQL authentication
username = os.environ.get("SQL_USERNAME")
password = os.environ.get("SQL_PASSWORD")
if not username or not password:
raise ValueError("SQL_USERNAME and SQL_PASSWORD required for SQL authentication")
conn_str = f"Server={server};Database={database};UID={username};PWD={password};Encrypt=yes;"
return mssql_python.connect(conn_str)
# Usage
conn = get_connection_from_env()
Med python-dotenv
Paketet python-dotenv laddar nyckel-värde-par från en .env fil till miljövariabler så att din kod läser inloggningsuppgifter på samma sätt i lokal utveckling och produktion. Filen .env håller sig utanför versionskontrollen (lägg till den i .gitignore), medan distribuerade miljöer injicerar samma variabler via sin plattformshemliga lagring.
Installera med pip install python-dotenv.
Skapa en .env fil i din projektrot med dina anslutningsparametrar:
# .env - add this file to .gitignore
SQL_SERVER=<server>.database.windows.net
SQL_DATABASE=<database>
SQL_USE_MSI=true
Ladda sedan in och använd dessa värden i ditt skript:
from dotenv import load_dotenv
import os
import mssql_python
# Load .env file into os.environ (no-op if the file doesn't exist)
load_dotenv()
server = os.getenv("SQL_SERVER")
database = os.getenv("SQL_DATABASE")
if not server or not database:
raise ValueError("SQL_SERVER and SQL_DATABASE must be set in .env or as environment variables")
use_msi = os.getenv("SQL_USE_MSI", "false").lower() == "true"
if use_msi:
conn_str = f"Server={server};Database={database};Authentication=ActiveDirectoryMSI;Encrypt=yes;"
else:
conn_str = f"Server={server};Database={database};Authentication=ActiveDirectoryDefault;Encrypt=yes;"
conn = mssql_python.connect(conn_str)
Tip
load_dotenv() Skriver inte över variabler som redan är inställda i miljön. I produktion, sätt samma variabelnamn genom din plattform (till exempel App Service-applikationsinställningar eller containermiljövariabler) och hoppa över .env filen helt.
Filbaserad konfiguration
Från JSON-konfigurationen
En JSON-konfigurationsfil låter dig definiera anslutningsinställningar för flera miljöer (utveckling, staging, produktion) på ett och samma ställe. Funktionen läser filen, väljer målmiljön och bygger reťazec pripojenia från de strukturerade inställningarna:
import json
import io
import mssql_python
def load_connection_from_json(config_file, environment: str = "development") -> str:
"""Load connection settings from a JSON config file or file-like object."""
config = json.load(config_file)
env_config = config.get(environment, {})
db_config = env_config.get("database", {})
params = {
"Server": db_config.get("server"),
"Database": db_config.get("database"),
"Encrypt": "yes" if db_config.get("encrypt", True) else "no",
}
auth_type = db_config.get("authentication", "sql")
if auth_type == "msi":
params["Authentication"] = "ActiveDirectoryMSI"
elif auth_type == "default":
params["Authentication"] = "ActiveDirectoryDefault"
elif auth_type == "windows":
params["Trusted_Connection"] = "yes"
else:
params["UID"] = db_config.get("username")
params["PWD"] = db_config.get("password")
return ";".join(f"{k}={v}" for k, v in params.items() if v)
# Example: load from an inline JSON config (in production, use open("config.json"))
sample_config = json.dumps({
"development": {
"database": {
"server": "localhost",
"database": "devdb",
"authentication": "windows",
"encrypt": False
}
},
"production": {
"database": {
"server": "prod.database.windows.net",
"database": "proddb",
"authentication": "msi",
"encrypt": True
}
}
})
conn_str = load_connection_from_json(io.StringIO(sample_config), "production")
print(f"Connection string: {conn_str}")
Från YAML-konfigurationen
YAML-konfigurationsfiler är ett läsbart alternativ till JSON. De används ofta i Python-projekt och Kubernetes-installationer. Denna metod läser anslutningsinställningar från en strukturerad YAML-fil och bygger reťazec pripojenia baserat på autentiseringstypen som definieras i konfigurationen.
Installera paketet genom att köra pip install pyyaml.
Skapa en database.yml fil i ditt projekt:
database:
server: <server>.database.windows.net
name: <database>
authentication: msi
encrypt: true
Ladda sedan in och använd dessa inställningar i ditt skript:
import yaml
import mssql_python
def load_from_yaml(config_path: str) -> mssql_python.Connection:
"""Load connection from YAML config."""
with open(config_path) as f:
config = yaml.safe_load(f)
db = config["database"]
parts = [
f"Server={db['server']}",
f"Database={db['name']}",
]
if db.get("trusted_connection"):
parts.append("Trusted_Connection=yes")
elif db.get("authentication") == "msi":
parts.append("Authentication=ActiveDirectoryMSI")
else:
parts.append(f"UID={db['username']}")
parts.append(f"PWD={db['password']}")
if db.get("encrypt", True):
parts.append("Encrypt=yes")
if db.get("trust_server_certificate"):
parts.append("TrustServerCertificate=yes")
return mssql_python.connect(";".join(parts))
conn = load_from_yaml("database.yml")
Integrering med Azure Key Vault
För produktionsdistributioner, lagra anslutningsuppgifter i Azure Key Vault istället för i konfigurationsfiler eller miljövariabler. Key Vault erbjuder centraliserad hemlighetshantering, åtkomstgranskning och automatisk rotation. Installera de nödvändiga paketen genom att köra pip install azure-keyvault-secrets azure-identity. En fullständig vägledning finns i Snabbstart: Azure Key Vault-klientbiblioteket för hemligheter för Python.
import os
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
import mssql_python
def get_connection_from_keyvault(vault_url: str) -> mssql_python.Connection:
"""Build connection using secrets from Azure Key Vault."""
credential = DefaultAzureCredential()
client = SecretClient(vault_url=vault_url, credential=credential)
server = client.get_secret("sql-server").value
database = client.get_secret("sql-database").value
username = client.get_secret("sql-username").value
password = client.get_secret("sql-password").value
conn_str = f"Server={server};Database={database};UID={username};PWD={password};Encrypt=yes;"
return mssql_python.connect(conn_str)
vault_url = os.environ.get("AZURE_KEY_VAULT_URL")
if vault_url:
conn = get_connection_from_keyvault(vault_url)
Hantera specialtecken
Escape semikolon och tandställning
Du behöver undvika reťazec pripojenia-värden som innehåller specialtecken. Omslut värdet med klamrar {} och dubbla eventuella interna avslutande klamrar }:
def escape_value(value: str) -> str:
"""Escape special characters in connection string values."""
if ";" in value or "{" in value or "}" in value:
# Wrap in braces and escape internal braces
value = value.replace("}", "}}")
return "{" + value + "}"
return value
# Password with semicolon
password = "my;complex;password"
escaped_password = escape_value(password) # {my;complex;password}
conn_str = f"Server=<server>;Database=<database>;UID=<login>;PWD={escaped_password};"
Byggare med automatisk flykt
Denna builderklass kapslar automatiskt in varje värde, så anroparna behöver inte komma ihåg escape-regler. Använd det när anslutningsparametrar kommer från extern inmatning såsom användarformulär, konfigurations-API:er eller hemliga lagringar där värden kan innehålla semikolon eller klammer:
class SafeConnectionStringBuilder:
"""Connection string builder with automatic escaping."""
SPECIAL_CHARS = {";", "{", "}"}
def __init__(self):
self._params = {}
def _escape(self, value: str) -> str:
if any(c in value for c in self.SPECIAL_CHARS):
value = value.replace("}", "}}")
return "{" + value + "}"
return value
def set(self, key: str, value: str) -> "SafeConnectionStringBuilder":
self._params[key] = self._escape(value)
return self
def build(self) -> str:
return ";".join(f"{k}={v}" for k, v in self._params.items())
# Safely handles special characters
builder = SafeConnectionStringBuilder()
builder.set("Server", "<server>.database.windows.net")
builder.set("Database", "<database>")
builder.set("PWD", "pass;word{with}special") # Automatically escaped
conn_str = builder.build()
Validation
Innan du använder en dynamiskt byggd reťazec pripojenia i din applikation, kontrollera att den faktiskt ansluter. Denna hjälpfunktion försöker en lättviktig fråga och returnerar ett boolskt resultat:
import mssql_python
def validate_connection_string(conn_str: str) -> bool:
"""Validate a connection string by attempting to connect."""
try:
conn = mssql_python.connect(conn_str)
cursor = conn.cursor()
cursor.execute("SELECT 1")
cursor.fetchone()
conn.close()
return True
except mssql_python.Error as e:
print(f"Connection failed: {e}")
return False
# Test before using
conn_str = "Server=<server>.database.windows.net;Database=<database>;Authentication=ActiveDirectoryDefault;Encrypt=yes;"
if validate_connection_string(conn_str):
print("Connection string is valid")