tech.chakapoko.com
Home / Python / DB

[Python]pyodbc,SQLAlchemyでMicrosoft SQL Serverを利用する

Microsoft ODBC Driver for SQL Serverのインストール (MacOS)

Microsoftのサイトで紹介されている手順でODBCドライバをインストールします。

https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15#macos

$ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
$ brew update
$ HOMEBREW_NO_ENV_FILTERING=1 ACCEPT_EULA=Y brew install msodbcsql17 mssql-tools

pyodbcのインストール

$ pip install pyodbc

pyodbcでSQL Serverに接続する

以下のスクリプトはSQL Serverに接続してバージョン情報を出力します。

import pyodbc

driver = 'ODBC Driver 17 for SQL Server'
server = 'localhost'
username = 'sa'
password = 'yourStrong(!)Password'

cnxn = pyodbc.connect('DRIVER={%s};SERVER=%s;UID=%s;PWD=%s' % (driver, server, username, password))
cursor = cnxn.cursor()

cursor.execute("SELECT @@version;")
row = cursor.fetchone()
while row:
    print(row[0])
    row = cursor.fetchone()

結果は次のようになります。

Microsoft SQL Server 2019 (RTM-CU2) (KB4536075) - 15.0.4013.40 (X64)
        Feb  3 2020 16:40:57
        Copyright (C) 2019 Microsoft Corporation
        Developer Edition (64-bit) on Linux (Ubuntu 16.04.6 LTS) <X64>

「ODBC Driver 17 for SQL Server」などのドライバ名はインストールしたドライバのodbcinst.iniに記述してあるようです。

$ cat /usr/local/Cellar/msodbcsql17/17.5.2.1/odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL S
Driver=/usr/local/lib/libmsodbcsql.17.dylib

pyodbc + sqlalchemyでSQL Serverに接続する

pyodbc単体で使うよりはsqlalchemyの便利なAPIを利用する方が楽です。

pipコマンドでsqlalchemyをインストールしておきます。

$ pip install sqlalchemy

以下のスクリプトはpyodbcとsqlalchemyを組み合わせて利用する例です。SQL Serverに接続してバージョン情報を出力します。

import urllib
from sqlalchemy import create_engine

driver = 'ODBC Driver 17 for SQL Server'
server = 'localhost'
username = 'sa'
password = 'yourStrong(!)Password'

odbc_connect = urllib.parse.quote_plus(
    'DRIVER={%s};SERVER=%s;UID=%s;PWD=%s' % (driver, server, username, password))
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % odbc_connect)

with engine.connect() as conn:
    rs = conn.execute('SELECT @@VERSION as version')
    for row in rs:
        print(row['version'])

結果は次のようになります。

Microsoft SQL Server 2019 (RTM-CU2) (KB4536075) - 15.0.4013.40 (X64)
        Feb  3 2020 16:40:57
        Copyright (C) 2019 Microsoft Corporation
        Developer Edition (64-bit) on Linux (Ubuntu 16.04.6 LTS) <X64>