mssql-pythonの新しいこと

mssql-pythonドライバーの各リリースでは、新機能、パフォーマンス向上、バグ修正が導入されます。 以下のセクションでは、すべてのバージョンを詳述します。

MSSQL-Python 1.12.0

発売日:2026年7月

[機能強化]

スタンドアロン mssql-python-odbc コンパニオンパッケージ

mssql-pythonが実行時に必要とするODBCドライバーバイナリも、別個のデータ専用パッケージとして公開されています:mssql-python-odbc(インポート名mssql_python_odbc、現在はバージョン18.6.2にピン留めされています)。 mssql-pythonパッケージはmssql-python-odbc==18.6.2install_requiresを宣言しているので、pip install mssql-pythonはコンパニオンパッケージを一緒に明らかにインストールします。 コードに変更を加える必要はありません。

ネイティブローダーは外部 mssql_python_odbc パッケージが存在する場合は優先し、存在しない場合は mssql-python ホイール内にバンドルされたODBCバイナリにフォールバックします。 このフォールバックはPythonグローバルインタプリタロック(GIL)で安全であり、AlpineのようなmuslベースのLinuxディストリビューションでも動作します。

この分割により、Pythonコードとは独立してドライバーバイナリをピン留めや更新でき、リディストリビューターの時間軸がmssql-python小さくなり、バンドルされたODBCファイルからの重複所有問題を回避できます。

Important

これにより、船が分割されることなく変化が発生します。 将来のメジャーリリース(v2.0.0)では、バンドルされた libs/ ツリーが削除される可能性があり、その場合 mssql-python-odbc 実行時間の厳格要件となります。

バグの修正

cursor.bulkcopy() 現在は親接続の接続タイムアウトを使用します

一括コピー操作は mssql_py_core ネイティブ拡張を介して別の接続を開きます。 以前は、この操作は常に15秒間の接続タイムアウトをハードコードしており、Pythonからは上書きできませんでした。 親接続(connect(..., timeout=<seconds>))に接続タイムアウトを設定すると、 bulkcopy() その値を内部接続に転送します。 timeout=0 に設定すると、上書きなしの動作が維持され、内部のデフォルト値である15秒がそのまま使用されます。 bulkcopy()コール時のカーソルのタイムアウトは操作に使われるため、親接続の変更が進行中の一括コピーには影響しません。

以下の例はProduction.Cultureのサンプルデータベースのルックアップテーブルを使用しています。 環境に合わせて接続文字列とデータベース名を調整してください:

import mssql_python
from datetime import datetime

# The 60-second timeout applies to both the initial connection and
# the internal connection that bulkcopy() opens.
conn = mssql_python.connect(
    "Server=<server>;"
    "Database=AdventureWorks2022;"
    "Encrypt=yes",
    timeout=60,
)
conn.autocommit = True
cursor = conn.cursor()

# Bulk-copy two rows into Production.Culture (CultureID, Name, ModifiedDate).
now = datetime.now()
rows = [
    ("xx", "Demo culture 1", now),
    ("yy", "Demo culture 2", now),
]
result = cursor.bulkcopy("Production.Culture", rows)
print(f"Copied {result['rows_copied']} rows")

# Remove the demo rows so the sample is re-runnable.
cursor.execute("DELETE FROM Production.Culture WHERE CultureID IN ('xx','yy')")

cursor.bulkcopy() CLRユーザー定義型列のサポート

以前は、cursor.bulkcopy() は、組み込みの geographygeometryhierarchyid 型や、アセンブリに登録されたカスタム CLR UDT など、共通言語ランタイム(CLR)のユーザー定義型を使用する任意の宛先列に対して、Protocol Error: Unsupported TDS type for bulk copy: 0xF0 で失敗していました。 ネイティブ mssql_py_core ワイヤーパスにはUDT型トークン(0xF0)のハンドラがなく、列メタデータの書き込み中に行が送信される前にエラーが発生しました。 CLR UDT列は配線上の varbinary(max) にマッピングされ、供給されたバイトはUDTの IBinarySerialize ペイロードとしてストリーミングされ、 pyodbc および python-tds のUDT列の読み込み方法に対応します。 SQL Server は、挿入時に UDT を実体化します。 mssql_py_core 0.1.6 から 0.1.7 への更新で反映されました。

以下の例は、HumanResources.Employee(階層型列で、SQL Serverの組み込みCLR UDTの一つ)の組織図列を新しいテーブルにアーカイブしています。 実際のワークフローでは、UDTバイトは別のSQL Serverインスタンス、シリアル化されたファイル、またはCLRタイプのIBinarySerialize.Write()出力から来ることがあります。この例では既存のカラムからCAST(... AS varbinary(max))経由で読み取るため、サンプルは自己完結型です。 バルクコピーには、 OrganizationNode がNULLである行が含まれます:

import mssql_python

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=AdventureWorks2022;"
    "Encrypt=yes",
)
conn.autocommit = True  # bulkcopy uses a separate connection; the destination must be visible
cursor = conn.cursor()

cursor.execute(
    "IF OBJECT_ID('dbo.EmployeeOrgArchive','U') IS NOT NULL "
    "DROP TABLE dbo.EmployeeOrgArchive;"
    "CREATE TABLE dbo.EmployeeOrgArchive (BusinessEntityID int, OrganizationNode hierarchyid);"
)

# Casting a hierarchyid column to varbinary(max) yields the UDT's
# serialized IBinarySerialize payload.
cursor.execute(
    "SELECT BusinessEntityID, CAST(OrganizationNode AS varbinary(max)) "
    "FROM HumanResources.Employee;"
)
rows = cursor.fetchall()

# Stream the (id, bytes) tuples into the destination's hierarchyid column.
result = cursor.bulkcopy("dbo.EmployeeOrgArchive", rows)
print(f"Copied {result['rows_copied']} rows")

cursor.execute("DROP TABLE dbo.EmployeeOrgArchive")

カスタムのアセンブリ登録CLR UDTの場合は、宛先テーブルの型を使い、型の IBinarySerialize.Write() メソッドで生成されるバイトを提供します。

MSSQL-Python 1.11.0

発売日:2026年7月

[機能強化]

コンテキストマネージャーの意味論の改善

with connection: クリーンエグジット時にトランザクションを正しくコミットし、例外時にはロールバックすることで、よりPython的で予測可能になりました。

import mssql_python

# On clean exit, transaction commits
with mssql_python.connect(connection_string) as conn:
    cursor = conn.cursor()
    cursor.execute("INSERT INTO MyTable (Name) VALUES ('Alice')")
    # Automatically committed on exit

# On exception, transaction rolls back
try:
    with mssql_python.connect(connection_string) as conn:
        cursor = conn.cursor()
        cursor.execute("INSERT INTO MyTable (Name) VALUES ('Bob')")
        raise ValueError("Oops!")
except ValueError:
    pass
# Changes rolled back on exit

バグの修正

  • ODBC のテアダウン パス(conn.close() および cursor.close())と、SSH トンネルおよびインプロセス フォワーダー構成における SQLDescribeParam 値のパラメーターに対する None で発生する GIL デッドロックを修正しました。
  • 一時テーブルやテーブル変数に固定された BINARY および VARBINARY のNULLパラメータ。 自動型解決が失敗すると、ドライバーは明示的なcursor.setinputsizes()誘導を含むPython警告を発します。
  • Apple Silicon 環境でのクリーンインストール時に import mssql_python が失敗する問題を修正しました(1.8.0で発生したリグレッション)。 バンドルされたODBCのdylib依存関係は、 arm64 アーキテクチャと x86_64 アーキテクチャの両方で書き換えられました。
  • Rustコアで Authentication=ActiveDirectoryServicePrincipal認証時に一括コピー操作が凍結していたGILのデッドロックを修正しました。

MSSQL-Python 1.10.0

リリース日: 2026 年 6 月

[機能強化]

ActiveDirectoryServicePrincipalのバルクコピーのサポート

cursor.bulkcopy() 現在は Authentication=ActiveDirectoryServicePrincipalをサポートし、サービスプリンシパル認証情報を使った一括挿入が可能です。

import mssql_python

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryServicePrincipal;"
    "UID=<application-client-id>;"
    "PWD=<client-secret>;"
    "Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##SpDemo (ID INT, Value FLOAT)")
conn.commit()

result = cursor.bulkcopy("##SpDemo", [(1, 1.5), (2, 2.5)])
print(f"Copied {result['rows_copied']} rows")

バグの修正

  • Arrowのフェッチパスに固定された非ASCIIの VARCHARCHAR データ。
  • 一括読み込み処理中に発生する接続タイムアウトを修正しました。

MSSQL-Python 1.9.0

リリース日: 2026 年 6 月

[機能強化]

一括コピー内の行オブジェクト

cursor.bulkcopy() では、手動でタプルに変換することなく、フェッチした Row オブジェクトを直接受け取れるようになりました。

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

# Fetch rows from source table
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product")
rows = cursor.fetchall()

# Pass fetched Row objects directly to bulkcopy
cursor.execute("CREATE TABLE ##RowBulkDemo (ProductID INT, Name NVARCHAR(50), ListPrice MONEY)")
conn.commit()
result = cursor.bulkcopy("##RowBulkDemo", rows)
print(f"Copied {result['rows_copied']} rows")

バグの修正

  • 固定ホイールパッケージング simdutf 常に静的にリンクされています。
  • DECIMAL内の大きなexecutemany()挿入を修正。
  • NULLパラメータの誤った型フォールバックを修正しました。
  • 例外の pickle と unpickle の往復処理を修正しました。
  • nextset() を修正し、結果セット間で PRINT メッセージが保持されるようにしました。
  • Row実行時データフォールバックパスにおけるexecutemany()処理を修正しました。
  • 静的解析ツール向けの fetch メソッドの型チェックを修正しました。

MSSQL-Python 1.8.0

リリース日: 2026 年 5 月

[機能強化]

ActiveDirectoryMSIによるバルクコピーのサポート

cursor.bulkcopy() 現在はシステム割り当ておよびユーザー割り当てのマネージドIDの Authentication=ActiveDirectoryMSI をサポートしています。

import mssql_python

# System-assigned managed identity
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryMSI;"
    "Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##MsiDemo (ID INT, Name NVARCHAR(50))")
conn.commit()

result = cursor.bulkcopy("##MsiDemo", [(1, "Alice"), (2, "Bob")])
print(f"Copied {result['rows_copied']} rows")

行の文字列キーによるインデックス指定

現在では、位置インデックスや属性アクセスに加え、列名(例えば row["col"])で行の値にアクセスできます。

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID = 1")
row = cursor.fetchone()

# Access by column name (new in 1.8.0)
print(row["ProductID"]) # Access by key
print(row["Name"])

# Still supports positional indexing
print(row[0])           # Positional access

# And attribute access
print(row.Name)         # Attribute access

バンドルされたODBCドライバーのアップグレード

Microsoft ODBCドライバ(SQL Server用)は18.6.2.1に更新されました。

バグの修正

  • トークンベース認証における遅延接続属性の寿命問題を修正しました。
  • 認証パスにおける繰り返し接続文字列解析を修正しました。
  • シーケンス入力の executemany() 型注釈を修正しました。

MSSQL-Python 1.7.1

リリース日: 2026 年 5 月

[機能強化]

ホイールのカバー範囲の拡大と性能向上

このリリースではRHEL 8互換ホイールが追加され、macOS Python 3.10のuniversal2ホイールが復元され、simdutfを通じてUTF-16の処理が向上し、execute()ホットパスが最適化されました。

パフォーマンスへの影響: execute() 法でのホットパス最適化により、バッチ実行スループットが典型的なワークロードで~15% 向上します。

バグの修正

  • ログイン失敗時に、mssql_pythonではなくRuntimeError DB-API例外が発生するように修正しました。
  • ODBCの実行、フェッチ、トランザクション、接続属性呼び出しのブロックにGILリリースを拡張しました。
  • 小数値の符号が変わる際に発生する executemany() の不具合を修正しました。
  • プラットフォーム間で一貫していなかった CP1252 の VARCHAR デコードを修正しました。
  • cursor.bulkcopy()列およびNVARCHAR(MAX)列の空文字列におけるVARCHAR(MAX)エラーを修正しました。

Note

バージョン1.7.0は出版上の問題により撤回されました。 バージョン1.7.1以降を使いましょう。

MSSQL-Python 1.6.0

リリース日: 2026 年 4 月

[機能強化]

パーサーベースの接続文字列サニタイズ

この改良により、パスワードフィールドやブレイシング値の特殊文字の正確な解析が保証されます。

import mssql_python

# Complex passwords with special characters now parse correctly
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "UID=user@contoso;"
    "PWD={p@ssw0rd;with{braces}};"  # Braced values now handled correctly
    "Encrypt=yes"
)

Connection stringのサニタイズは、ODBC 接続文字列構文の正しい扱いのために、正則表現ベースのロジックからパーサーベースの処理へと移行しました。

バグの修正

  • ODBC接続・切断操作のブロック時にGILリリースが固定されました。
  • setinputsizes()SQL_DECIMAL のヒントがある場合の SQL_NUMERIC クラッシュを修正しました。
  • ODBCカタログメソッドの誤った fetchone() 挙動を修正しました。
  • reset_cursor=False を使用した際の無効カーソル状態エラーを修正しました。
  • マッピングベースのパラメータ列のための固定 executemany() 型ヒント。
  • setup_logging(log_file_path=...)に対するパス・トラバーサル対策を追加しました。

MSSQL-Python 1.5.0

リリース日: 2026 年 4 月

新機能

Apache Arrow フェッチサポート

3つの新しいカーソル方式が、Arrow Cデータインターフェースを通じて高性能な列形式データ取得を提供します。

  • cursor.arrow() 完全な pyarrow.Tableを返します。
  • cursor.arrow_batch() は単一の pyarrow.RecordBatch を返します。
  • cursor.arrow_reader() は、ストリーミング用の pyarrow.RecordBatchReader を返します。

この実装は、パフォーマンス向上のためにホットパスでPythonオブジェクト作成をバイパスしています。 完全なドキュメントについては、 Apache Arrow統合を参照してください。

sql_variant 型のサポート

ドライバーはフェッチ時にsql_variant列を検出し、その基礎となるベース型を解決し、生のバイトではなく正しく型付けされたPython値を返します。

Note

sql_variant カラムはストリーミングフェッチパスを使用しており、固定型カラムと比べてわずかなパフォーマンスに影響がある場合があります。

ネイティブUUIDサポート

新しい native_uuid 設定により、 UNIQUEIDENTIFIER 列を uuid.UUID オブジェクト(デフォルト)として返すか、pyodbc互換の大文字文字列として返されるかを制御します。 モジュールレベルまたは接続ごとに設定してください:

# Module-level default
settings = mssql_python.get_settings()
settings.native_uuid = True  # default

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

詳細については、 モジュール構成を参照してください。

ロークラス公共輸出

Rowクラスは現在、型注釈のために最上層でエクスポートされています。

from mssql_python import Row

バグの修正

  • 括弧で囲まれた識別子、文字列リテラル、コメント内での ? の誤検知を修正しました。
  • VARBINARY列のNULLパラメータバインディングを固定しました(暗黙の変換エラーが発生しません)。
  • datetime.time 列から TIME(1) 列までの列で、TIME(7) 値のラウンドトリップ時にマイクロ秒が失われる問題を修正しました。
  • TIME列ごとに分数秒を正しく含めるための固定矢印フェッチパス。
  • Microsoft Entra ID認証方法による固定の一括コピー(古い認証フィールドは検証エラーを起こしなくなりました)。
  • 認証性能向上のためにモジュールレベルでAzure Identityの認証インスタンスをキャッシュすること。

MSSQL-Python 1.4.0

発売日:2025年3月

新機能

一括コピーサポート

高性能な大量データロードは以下の方法で利用可能 cursor.bulkcopy():

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

cursor.execute("CREATE TABLE ##BulkDemo (ID INT, Name NVARCHAR(50), Price DECIMAL(10,2))")
conn.commit()

data = [
    (1, "Item 1", 10.50),
    (2, "Item 2", 20.75),
    # ... potentially millions of rows
]

result = cursor.bulkcopy("##BulkDemo", data)
print(f"Copied {result['rows_copied']} rows")

この方法は、 batch_sizetimeoutcolumn_mappingskeep_identitycheck_constraintstable_lockkeep_nullsfire_triggersuse_internal_transactionの選択肢を受け入れています。

完全なドキュメントについては 「一括コピー 」をご覧ください。

Improvements

  • 大規模な結果セットに対するパフォーマンス最適化。
  • バッチ操作中のメモリ使用量を削減します。
  • 一括コピー失敗に対する強化されたエラーメッセージ。

MSSQL-Python 1.3.0

発売日:2025年1月

新機能

設定クラス

新しい Settings クラスを通じてモジュール全体の動作を設定できます:

import mssql_python

settings = mssql_python.get_settings()
settings.lowercase = True       # Lowercase column names in cursor.description

詳細は モジュール構成 を参照してください。

Improvements

  • Azure SQLフェイルオーバー時の接続タイムアウトの扱いが良くなりました。
  • Python 3.13との互換性が向上しました。

MSSQL-Python 1.2.0

発売日:2024年11月

新機能

スキーマ発見手法

データベースメタデータ探索のための新しいカーソル手法:

cursor = conn.cursor()

# List all tables
cursor.tables(schema="dbo")

# Get column information
cursor.columns(table="Product", schema="Production")

# Get primary keys
cursor.primaryKeys(table="Product", schema="Production")

# Get foreign key relationships
cursor.foreignKeys(table="SalesOrderDetail", schema="Sales")

# Get stored procedures
cursor.procedures(schema="dbo")

# Get index statistics
cursor.statistics(table="Product", schema="Production")

# Get type information
cursor.getTypeInfo()

完全なドキュメントについては スキーマ発見 を参照してください。

Improvements

  • 繰り返しスキーマクエリのための強化メタデータキャッシュ。
  • columns() の結果における計算列の処理が改善されました。

MSSQL-Python 1.1.0

発売日:2024年9月

新機能

カスタム出力コンバータ

フェッチ中に列の値を変換するためのカスタム関数レジスタ:

import mssql_python
from decimal import Decimal

conn = mssql_python.connect(connection_string)

# Convert decimals to float (converter receives Decimal)
def decimal_to_float(value):
    if value is None:
        return None
    return float(value)  # value is already a Decimal object

conn.add_output_converter(mssql_python.SQL_DECIMAL, decimal_to_float)

# Custom money formatting
def format_money(value):
    if value is None:
        return "$0.00"
    return f"${float(value):,.2f}"  # value is already a Decimal object

conn.add_output_converter(mssql_python.SQL_DECIMAL, format_money)

管理方法:

  • add_output_converter(sql_type, converter_func)
  • get_output_converter(sql_type)
  • remove_output_converter(sql_type)
  • clear_output_converters()

完全なドキュメントについては 「カスタムタイプコンバータ」を参照してください。

Improvements

  • 型変換失敗に対するエラーメッセージの改善。
  • Noneを返す変換関数のサポート。

MSSQL-Python 1.0.0

発売日:2024年7月

初期のGAリリース

mssql-python の最初の一般提供版リリース。これは、Microsoft の SQL Server 向けネイティブ Python ドライバーです。

コア機能

  • DDBCアーキテクチャ:ODBCドライバーのインストールを不要に直接データベース接続。
  • DB-API 2.0準拠:標準Pythonデータベースインターフェース。
  • 接続プーリング:組み込みの接続プール管理。
  • Microsoft Entra認証:Azureのアイデンティティベース認証の完全サポート。
  • TLS暗号化:証明書検証による安全な接続。

接続機能

  • 21 個の接続文字列キーワード
  • 9つの認証モード(SQL、Windows、7つのMicrosoft Entra IDメソッド)。
  • オートコミットコントロール。
  • 実行方法: execute()executemany()batch_execute()
  • set_attr()getinfo()を通じた接続属性。
  • コンテキストマネージャーのサポート。

カーソル機能

  • 標準的なフェッチ方法: fetchone()fetchmany()fetchall()
  • 拡張方法: fetchval()skip()
  • 実行方法: execute()executemany()
  • 属性とインデックスアクセスを持つ行オブジェクト。
  • nextset()による複数結果セットナビゲーション。

データ型のサポート

  • すべてSQL Serverのネイティブ型です。
  • Python↔SQL 型マッピング。
  • 明示的な型付けのためのSQL型定数(例: mssql_python.SQL_DECIMAL)。
  • PythonでのNULL処理 None

トランザクションのサポート

  • 手動コミットとロールバック
  • オートコミットモード。
  • 隔離レベルの管理。
  • デッドロック検出と処理。

認証モード

Mode 説明
SQL Server認証 ユーザー名とパスワード
Windows 認証 Trusted_Connection
ActiveDirectoryDefault DefaultAzureCredential
ActiveDirectoryInteractive ブラウザベースのサインイン
ActiveDirectoryDeviceCode デバイス コード フロー
ActiveDirectoryPassword Microsoft Entra ユーザー名とパスワード(非推奨;ROPCを使用)
ActiveDirectoryMSI マネージド ID
ActiveDirectoryServicePrincipal サービス プリンシパル
ActiveDirectoryIntegrated Windows Kerberos

Upgrade

pyodbcより

詳細な移行ガイダンスについては、「 pyodbcからの移行」をご覧ください。

主な違い:

  • ?(qmark)と%(name)s(pyformat)パラメータスタイルの両方をサポートしています。 既存の ? クエリは変更なしで動作します。
  • callproc()方法はありません。 代わりに EXECUTE ステートメントを使いましょう。
  • 組み込みの接続プーリング。
  • 外部ODBCドライバー依存性はありません。

pymssqlより

詳細な移行ガイダンスについては「 Migrate from pymssql」を参照してください。

主な違い:

  • %sおよび%dパラメータマーカーを?または%(name)sに置き換えます。
  • 位置論の代わりに接続文字列を使いましょう。
  • FreeTDSに依存していません。
  • 接続ごとに複数の同時カーソルがあります。
  • 属性アクセス権を持つ行オブジェクトが as_dict=Trueを置き換えます。

mssql-pythonのバージョン間

ドライバーをアップグレードして新機能や修正を手に入れましょう。

pip install --upgrade mssql-python

本番システムをアップグレードする前に、互換性のない変更がないかリリースノートを確認してください。

ロードマップ

今後の機能や開発ロードマップについては、GitHubリポジトリをご覧ください。