Apple Silicon から Python で Azure SQLDatabase へ接続する場合、 2023年現在、ちょっと面倒な手続きが必要なので簡単にまとめた。
Environment
- OS: macOS Monterey Version 12.6
- Chip: Apple M1 Pro
- Python 3.10.9
セットアップ手順
Install unixodbc
% brew install unixodbc
Install ODBC Driver
Microsoft のページに書いてあるように ODBC をインストールする。
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
% brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
% brew update
% HOMEBREW_ACCEPT_EULA=Y brew install msodbcsql18 mssql-tools18
(参考: Install the Microsoft ODBC driver for SQL Server (macOS) - Microsoft ODBC 18)
ini の設定もしておく。
% sudo ln -s /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
% sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini
(参考: Install the Microsoft ODBC driver for SQL Server (macOS) - Troubleshooting)
Install pyodbc
ここがやや面倒なところで、単純に pip3 install pyodbc
とやっても pyodbc
がインポートできずにプログラムが終了する。 そのときのエラーは記事の下の方に記載している。
% pip3 install --no-cache-dir --no-binary :all: pyodbc
私の環境ではこれにより pyodbc 4.0.35 がインストールされた。
(2023-06-23 時点で、 最新のもの 4.0.39 だとうまくインストールできなかったというフィードバックがあった。)
接続テスト
import pyodbc
server = 'tcp:xxxxx.database.windows.net'
database = 'xxxxx'
username = 'xxxxx'
password = 'xxxxx'
conn = pyodbc.connect(
'DRIVER={ODBC Driver 18 for SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)
cursor = conn.cursor()
cursor.execute("SELECT * FROM table")
for row in cursor:
print(row)
conn.close()
エラーの例
pyodbc をインポートできなかった場合は、下のようなエラーが出る。
Traceback (most recent call last):
File "/Users/otsukakenji/tools/util.py", line 2, in <module>
import pyodbc
ImportError: dlopen(/opt/homebrew/lib/python3.10/site-packages/pyodbc.cpython-310-darwin.so, 0x0002): symbol not found in flat namespace (_SQLAllocHandle)