mssql-pythonモジュール設定の設定

mssql-pythonドライバーはモジュール全体の動作を制御する Settings クラスを提供します。 これらの設定はすべての接続やカーソル操作に影響を与えます。 接続を作成する前に、アプリケーション起動時に一度だけ設定してください。

アクセス設定

現在の Settings オブジェクトを取得し、そのプロパティを検査または修正します:

import mssql_python

# Get settings object
settings = mssql_python.get_settings()

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

使用可能な設定

以下の設定は、ドライバーがデータをどのように返すかと結果のフォーマットを制御します。

小文字

lowercase設定はcursor.descriptionの列名が小文字で表示されるかどうかを制御します。 アプリケーションが名前でカラムにアクセスする場合で、大文字/小文字の不一致を避けたいときは、この設定を有効にしてください。 FlaskやFastAPIのようなウェブフレームワークはしばしば行を辞書に変換するため、一貫したケース設定が重要になります。

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', ...)
価値 説明
False Default. 列名は元の大文字・小文字を保持します。
True cursor.descriptionの列名は小文字に変換されます。

小数点の区切り文字

ドライバは数値変換のための十進区切りを制御するモジュールレベルの機能を提供します。 この設定を変更するのは、SQL Serverインスタンスがフランス語やドイツ語のlocalesのように、小数点区切りにコンマを付けている場合のみです。 ほとんどのアプリケーションではこの設定を変更する必要はありません:

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(",")

10進分類の処理についての詳細は、 データ型マッピングを参照してください。

native_uuid

native_uuid設定はUNIQUEIDENTIFIER列をPython uuid.UUIDオブジェクトとして返すか、pyodbc互換の大文字文字列として返すかを制御します。 この設定は、文字列UUID値に依存するpyodbcからの移行チームに有用です:

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
価値 説明
True Default. UNIQUEIDENTIFIER 列は uuid.UUID オブジェクトを返します。
False UNIQUEIDENTIFIER 列は大文字の文字列(pyodbc互換)を返します。

接続ごとに native_uuid を設定することもできます:

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

Note

native_uuid設定はmssql-pythonバージョン1.5.0で導入されました。

モジュールレベルの定数

ドライバーは読み取り専用 DB-API 2.0のコンプライアンス定数を公開し、その能力を記述します。 これらの定数を使って、異なる DB-API ドライバーに適応するコードを書きます:

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

apilevel定数は DB-API 遵守レベルを報告します:

価値 Meaning
'2.0' DB-API 2.0 完全準拠。

スレッドセーフティ

threadsafety定数はスレッドの安全性レベルを報告します:

価値 Meaning
0 スレッドはモジュールを共有できません。
1 スレッドはモジュールを共有しられますが、接続は共有できません。
2 スレッドはモジュールや接続を共有することができます。
3 スレッドはモジュール、接続、カーソルを共有することができます。

mssql-pythonドライバーは threadsafety = 1を使用します。つまり、以下の通りです:

  • モジュールはスレッド間でインポートして使用できます。
  • 各接続は一度に1つのスレッドにのみ属していなければなりません。
  • スレッドごとに別に接続を作成するか、接続プール(デフォルトで有効)を使います。 詳細については、 コネクションプーリングをご覧ください。

パラムスタイル

paramstyle定数はパラメータのプレースホルダー形式を報告します:

Style フォーマット Example
'qmark' 疑問符 WHERE id = ?
'numeric' 数値位置 WHERE id = :1
'named' 名前を付けられた WHERE id = :id
'format' ANSI C printf WHERE id = %s
'pyformat' Pythonフォーマット WHERE id = %(id)s

mssql-pythonドライバーは paramstyle = 'pyformat'を使用しています。 SQLインジェクションを防ぐために、必ず名前付きパラメータを使用してください。 文字列フォーマットやf文字列を使ってユーザーの入力を組み合わせてクエリを作ってはいけません:

# 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}
)

バージョン情報

どのバージョンのドライバーがインストールされているか確認してください:

import mssql_python

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

起動時に設定を設定してください

接続を作成する前に、アプリケーション起動時にモジュール設定を一度設定してください。 早めに値を設定することで、接続間での不整合な挙動を防げます:

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)

スレッド安全の考慮事項

モジュール設定はグローバルで、すべてのスレッド間の接続に影響を与えます。 接続がすでに開いている後に設定を変更すると、既存の接続がその変化を一貫して反映しない場合もあります。 最初の接続を作成する前に、すべての設定値を設定します:

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

接続を作成する前に設定をしてください。 接続ができた後に設定を変更すると、動作が一貫性に欠けることがあります。

接続固有の構成

グローバルデフォルトを変えずに接続ごとに設定を上書きできます。 アプリケーションの異なる部分で異なる挙動が必要な場合は、接続ごとのオーバーライドを使いましょう。 例えば、レポートモジュールは文字列UUIDを必要とし、他のアプリケーションは uuid.UUID オブジェクトを使用します。

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

# Use the autocommit property
conn.autocommit = True