mssql-python 2つのネイティブODBCプロバイダーのいずれかを読み込みます:
| Provider | Description | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 for SQL Server | Default |
mssql-odbc |
RustベースのODBCドライバー | プレビュー, オプトイン |
mssql-python-rs
0.4.0パッケージにはmssql-odbcプロバイダーが含まれています。
Availability
ドライバーは mssql-python-rs パッケージ内に、CPython 3.10以降のバージョン用のビルド済みホイールとして出荷されます。
| Platform | Architectures |
|---|---|
| Windows | x64;CPython 3.11以降のバージョンでのARM64 |
| macOS | universal2(x86_64およびarm64)、macOS 15以降のバージョン |
| Linux (glibc) | x86_64とaarch64(manylinux_2_28 および manylinux_2_34) |
| Linux (musl) | x86_64とaarch64(musllinux_1_2) |
ドライバーを有効にする
mssql-pythonをインストールするとmssql-python-rsもインストールされ、mssql-odbcドライバーが入っています。
python -m pip install mssql-python
--no-depsやプライベートインデックスでインストールする場合は、明示的にmssql-python-rsをインストールしてください。
最初の接続を開く前にプロバイダーを選択してください。 次のいずれかの方法を使用します。
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
MSSQL_CONNECTION_STRING環境変数をアプリケーションの接続文字列に設定してください。 証明書の検証を有効のままにしてください(Encrypt=yes;TrustServerCertificate=no)。 詳細については、「接続文字列 および 暗号化および証明書」をご覧ください。
選択したプロバイダーで次の例を実行してみてください:
import os
import mssql_python
with mssql_python.connect(os.environ["MSSQL_CONNECTION_STRING"], timeout=45) as connection:
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
print(cursor.fetchone()[0])
例は 1 を出力します。
提供者選定は以下のルールに従います:
-
MSSQL_PYTHON_NATIVE_PROVIDERは、native_providerよりも優先されます。 属性を競合するプロバイダーに設定するとRuntimeWarningが出力されます。 - ドライバーが読み込まれる前に、
native_providerをNoneに設定してPython の設定をクリアしてください。 これは環境変数を消すものではありません。 - 認識されていない提供者名は
ValueErrorが発生します。native_providerに無効な名前を割り当てると即座に例外が発生します; 無効な環境変数は接続時に例外が発生します。 ドライバーはデフォルトのプロバイダーにフォールバックしません。 - ドライバーがネイティブ接続の試みを開始すると、その試みが失敗してもプロバイダーは固定されます。 プロバイダーを切り替えるためにPythonを再起動してください。
native_providerを別のプロバイダーに変更しても、RuntimeWarningが発生し、効果はありません。
この時点より前に接続文字列の検証エラーやプロバイダーパッケージの欠如が発生します。 これらのエラーを修正し、再起動せずに別のプロバイダーを選ぶことができます。
mssql_python.get_native_provider_info()に電話してプロバイダー名、選択方法、選択が固定されているかどうかを確認してください。
msodbcsql18に戻るには、アプリケーションからMSSQL_PYTHON_NATIVE_PROVIDERとすべてのnative_provider割り当てを削除し、Python を再起動します。
マルチサブネット フェールオーバーの既定値
Rustプロバイダーは、該当する伝送制御プロトコル(TCP)接続に対してデフォルトで MultiSubnetFailover を有効にしています。 順次接続試行を要求するには、MultiSubnetFailover=no を明示的に設定してください。 展開全体のデフォルトを変更するには、ネイティブドライバーが最初に使用される前に MSSQL_RS_MULTISUBNET_FAILOVER_DEFAULT を true または false に設定してください。 connection-stringキーワードはこのデフォルトを上書きします。
数値 SQL_COPT_SS_MULTISUBNET_FAILOVER 属性(1248)も接続前に設定するとキーワードを上書きします。
このドライバは、非TCPトランスポート、データベースミラーリング、SQL Serverブラウザの検出を必要とする名前付きインスタンス、または明示的なプロトコルやアドレスを省略したローカルWindows接続に対してはこのデフォルトを有効にしていません。 非TCP トランスポート、データベース ミラーリング、または SQL Server Browser の検出で MultiSubnetFailover を明示的に有効にすると、接続エラーが発生します。 詳細は 高可用性とフェイルオーバー をご覧ください。
サポートされる機能
以下の機能は、既知の問題がありますが、サポートされています。
| Area | 注記 |
|---|---|
| 接続ライフサイクル | 接続、close()、with ブロック、ログイン タイムアウト、診断、現在のデータベースの変更などが可能です。 接続文字列の設定には、 ApplicationIntent、 MultiSubnetFailover、 IpAddressPreference、 PacketSize、 KeepAlive、 ConnectRetryCount / ConnectRetryInterval (アイドル接続の回復力)が含まれます。 ネイティブドライバーは、サーバー支援のドメインネームシステム(DNS)キャッシュや、サーバーがサポートしている場合の強化ルーティングもネゴシエートします。 |
| Authentication | SQL 認証 (UID / PWD)、Windows 認証 (Trusted_Connection=Yes、Windows では Security Support Provider Interface (SSPI)、Linux および macOS では Kerberos を使用)、および Microsoft Entra ID の対話型、統合、デバイス コード、サービス プリンシパル、マネージド ID、既定の資格情報、アクセス トークン。 Microsoft Entra IDのパスワード認証はサポートされていません。 詳細については、「既知の問題の」を参照してください。 |
| トランスポート層セキュリティ (TLS) |
Encrypt、TrustServerCertificate、HostnameInCertificate、ServerCertificate。 |
| クエリの実行 | 直接実行と準備済み実行、事前計画の再利用、qmark パラメーター、そして mssql-python が実行する pyformat 変換。 |
| ODBCエスケープ構文 | 機能、日付/時刻、外部結合、グローバル一意識別子 (GUID)、LIKE ... {escape ...}、インターバル、{encrypt ...} エスケープ形式。 |
| ストアド プロシージャ | Transact-SQL(T-SQL)や位置指定の{call ...}構文でexecute()を通じて呼び出し、結果セットを読み、nextset()で進めます。 |
| 入力パラメーター | スカラーパラメータ、SQL NULL、 setinputsizes()、そして通常/ストリーム混在パラメーター。 |
| 大きなパラメーター | ラージ テキスト、バイナリ、拡張可能マークアップ言語 (XML)、およびユーザー定義型 (UDT) パラメータは、実行時のデータ ストリーミングをサポートします。 |
executemany() |
ODBC パラメーター配列によるバッチ処理 ストリーム値を含む行は行単位実行にフォールバックします。 |
| 行の取得 |
fetchone()、 fetchmany()、 fetchall()、イテレーション、 fetchval()、タイプ変換、そして大規模なテキスト/バイナリストリーミングなどです。 |
| 矢印の取得 |
arrow_batch()、 arrow()、および arrow_reader()。
pyarrow が必要です。 |
| 複数の結果セット |
nextset()パラメータ配列によって生成される結果も含まれます。 |
| Transactions | オートコミット、コミット、ロールバック、そしてリード非コミット、リードコミット、リピーダブルリード、シリアライザブル、スナップショット分離レベル。 オートコミットをオフにすると、接続コンテキストマネージャーは成功裏に終了時にコミットし、例外が発生した際にロールバックします。 |
| クエリのタイムアウト | カーソルを作成する前に、Connection.timeoutを秒単位で設定してください。 ステートメントがそのタイムアウトを超えると、ドライバーは OperationalError を送出します。
0 はタイムアウトなしを意味します。 ログインタイムアウトは connect(timeout=...) を使用して個別に設定してください。 |
| コネクションプーリング | 組み込みの mssql-python プール(再利用前の接続リセットを含む) 認証固有のプール分離については、 アイデンティティ分離を参照してください。 |
| メタデータ API |
tables()、 columns()、 primaryKeys()、 foreignKeys()、 statistics()、 rowIdColumns()、 rowVerColumns()、 procedures()、および getTypeInfo()。 |
| Encoding とコンバーター | デフォルトのワイド文字エンコーディング、出力コンバータ、UTF-8やレガシーSQLソートIDコレーションを含む、コレーション対応の非Unicodeパラメータ。 カスタムのシングルバイト文字デコードはクライアントのコードページと一致しなければなりません。 詳細については、「既知の問題の」を参照してください。 |
Microsoft Entra IDの統合認証は、Windows上でサインインしている Windows アカウントを使用します。 LinuxおよびmacOSでは、Kerberosチケットを使ってテナントのActive Directory フェデレーション サービス (AD FS)(AD FS)エンドポイントに認証します。 前提条件については、Windows統合認証を参照してください。
arrow_reader()を閉じると、進行中のフェッチSQLCancelを中断します。
close call はキャンセルの片付けが終わるまで待つことになります。 詳細については、 Apache Arrowの統合を参照してください。
データの種類
ドライバーはxml、json、vectorの値をPython strオブジェクトとして返し、vectorはJavaScriptオブジェクト表記(JSON)配列で表現されます。
geometry、geography、hierarchyid などの共通言語ランタイム (CLR) 型を Python bytes オブジェクトとして返します。 詳細については、 データ型マッピング および 既知の問題をご覧ください。
既知の問題
msodbcsql18からワークロードを切り替える前に、これらの違いを確認してください。
| Issue | Details | Workaround |
|---|---|---|
| Microsoft Entra ID パスワード認証 |
Authentication=ActiveDirectoryPasswordはサポートされていません。 この方法は多要素認証(MFA)の要件を満たしません。 SQL認証(UID / PWD)は影響を受けません。 |
サービスプリンシパル、マネージドアイデンティティ、アクセストークンなど、別のMicrosoft Entra IDメソッドを使いましょう。 |
attrs_before 設定 |
Microsoft Entra IDの認証モードやアプリケーションの意図は数値接続属性として設定できません。 |
AuthenticationとApplicationIntent接続文字列のキーワードを使いましょう。 |
| 接続操作タイムアウト |
SQL_ATTR_CONNECTION_TIMEOUT はキャンセル クリーンアップを制御します。 プール接続のリセット時にタイムアウトを適用しません。 リセット中にサーバーが応答を停止すると、接続リクエストはブロックされたままになることがあります。 |
プールされたリセット タイムアウトは利用できません。 ログイン用に connect(timeout=...)、明細用に Connection.timeout を設定してください。 |
| マルチアドレスホスト |
msodbcsql18 デフォルトで透過ネットワークIP解決(TNIR)を有効にしています。 mssql-odbc はこれをサポートしていません。
mssql-python は、どちらのプロバイダーでも TransparentNetworkIPResolution 接続文字列キーワードを拒否します。 |
可用性グループリスナーやその他のマルチアドレスホストには MultiSubnetFailover=yes を使いましょう。 デフォルトについては、 マルチサブネットフェイルオーバーデフォルトを参照してください。 |
| データの分類 | センシティブ分類のメタデータは利用できず、 SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400)もサポートされていません。 |
クエリ sys.sensitivity_classifications。 |
fork() 接続後 |
Linuxでは、親プロセスの接続後にフォークされたプロセスは、新しい接続でもドライバーを使うとハングすることがあります。 プーリングを有効にしていると、親もハングする可能性があります。 (#566) |
spawnスタート方式を使い、各ワーカー内部で接続してください。 |
| Linuxにおけるネイティブトレーシング | ネイティブトレーシングを有効にすると、Pythonはプロセス終了時のドライバークリーンアップ中に異常終了することがあります。 | Linux では MSSQL_TDS_TRACE を未設定のままにします。 |
| 未読の結果 | カーソルを閉じたり別の文を実行したりすると、キャンセルするのではなく、残りの結果を読み取って破棄するため、時間がかかることがあります。 プリペアドステートメントのクリーンアップはステートメントのクエリタイムアウトを使用しますが、タイムアウトがゼロになるとそのクリーンアップは制限されなくなります。 | 例えば TOPで必要な行だけを取得し、カーソルを作成する前に Connection.timeout を設定しましょう。 |
| カスタム狭文字のデコード | ネイティブドライバーは、WindowsではWindowsのANSIコードページを、LinuxやmacOSではプロセスロケールのコードページをナローテキストに対して使用しています。 コードページと一致しない明示的なPythonでのデコードは、誤ったテキストやbytesのような不正な文字を生み出すことがあります。 |
デフォルトのワイド文字デコードを使用します: conn.setdecoding(mssql_python.SQL_CHAR)。 |
Connection.getinfo() |
一部の能力値やパケットサイズに基づく制限は msodbcsql18と異なります。
SQL_USER_NAME 接続文字列 UIDではなく、データベースのプリンシパルを報告します。 |
報告された機能や制限がアプリケーションに関係する場合は、特定のサーバーメタデータをクエリしてください。 |
| メモリ不足エラー | 一部のドライバー割り当ての失敗は、MemoryErrorを送出する代わりにPythonプロセスを終了させることもあります。 (#484) |
送信する値や取得する値のサイズを制限しましょう。 |
| 大きな値の読み取りパフォーマンス |
varchar(max)およびnvarchar(max)データのチャンクリードはmsodbcsql18よりも遅くなることがあります。 (#473) |
ワークロードをベンチマーク化します。 |
問題を報告
バグが発生した場合は、 msodbcsql18 で再現し、両方のプロバイダーで発生したかどうかを記録してください。 切り替え手順については「ドライバーを有効にする」を参照してください。
レポートにはmssql_python.get_native_provider_info()の出力、OSの情報、Pythonおよびドライバーのバージョン、そして失敗したT-SQLバッチとエラーメッセージを含めてください。
- Rust ドライバーの問題: https://github.com/microsoft/mssql-rs/issues
-
mssql-python問題点: https://github.com/microsoft/mssql-python/issues
Windowsでは、Pythonを起動する前にPowerShellでこれらの変数を設定し、ネイティブドライバーの診断を収集してください。
mssql-odbcを選択して問題を再現してください:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "debug"
$env:MSSQL_TDS_TRACE_DIR = ".\traces"
MSSQL_TDS_TRACE トレースを有効にし、MSSQL_TDS_TRACE_LEVEL ログレベルを選択し、MSSQL_TDS_TRACE_DIR 標準エラー出力ではなく、ネイティブ ODBC ドライバーのプロセスごとのトレースファイル用のディレクトリを選択します。 Rustのコンパニオンパッケージは、現在のディレクトリ内の mssql_python_logs 配下にもログファイルを作成します。
トレースにはT-SQLテキストやパラメーター値が含まれます。 抜粋を共有する前に機密データを伏せてください。 診断後、これらの変数を削除し、Pythonを再起動してトレーシングを無効にしてください。