背景
会社にて、FastAPI で、SQL Server の情報を利用する必要が生じたので、試行した記録
今回は以下
- SQLAlchemy
- ODBC Driver
- SQL Server アクセス
以下を参考に
SQLAlchemy インストール
pip3 install sqlalchemy
ODBC インストール
ドライバー一覧の確認
最初は入ってないと思うので、インストール後に確認用
cat /etc/odbcinst.ini
基本は以下
WSL のバージョン確認
lsb_release -rs
pyodbc のインストール
pip3 install pyodbc
ODBC Driver インストール
if ! [[ "18.04 20.04 22.04" == *"$(lsb_release -rs)"* ]];
then
echo "Ubuntu $(lsb_release -rs) is not currently supported.";
exit;
fi
sudo su
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.list
exit
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo apt-get install -y unixodbc-dev
curl が上手くいかなかった場合の対処法
prod.list を確認して
https://packages.microsoft.com/config/ubuntu/20.04/prod/pool/main/m/
辺りから、以下をwindows 上でダウンロード
msodbcsql18_18.1.1.1-1_amd64.deb
mssql-tools18_18.1.1.1-1_amd64.deb
/tmp 等にコピーをして、以下のようにして解凍
sudo dpkg -i /tmp/msodbcsql18_18.1.1.1-1_amd64.deb
sudo dpkg -i /tmp/mssql-tools18_18.1.1.1-1_amd64.deb
あとは、上述のsudo apt-get update
以降を実施
解凍順序を逆にするとエラーにが出るので注意
Ver 17 にしたいなら、適宜修正。
以下も参考に
エクスプローラーから、wsl へのアクセス
\\wsl$
FastAPI のチュートリアルに従って、sample app を準備する
準備したら、DB接続の確認へ
SQL Server への接続
チュートリアルでは、以下のように、sqlite 用になっているので、これを修正する必要がある
SQL Server 用の修正
ここからは、以下を参考に
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.engine import URL
connection_url = URL.create(
"mssql+pyodbc",
username="user",
password="pass",
host=r"USER\SQLEXPRESS",
port=1433,
database="testDB",
query={
"driver": "ODBC Driver 18 for SQL Server", # 17 でもOK
"autocommit": "True",
"LongAsMax": "Yes",
},
)
engine = create_engine(
connection_url,
encoding="utf-8",
echo=True,
connect_args={"TrustServerCertificate": "yes"},
pool_pre_ping=True,
pool_recycle=3600,
pool_timeout=30,
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
接続情報は適宜修正のこと
実際の動作確認
uvicorn fastapi_sample_app.main:app --reload
以下のように、フォルダ内で実行すると、下記のようなエラーが出るので注意
uvicorn main:app --reload
attempted relative import with no known parent package
成功時
失敗の対処記録
SQL Server にログイン出来ない
原因
- SQL Server Express で SQL Server 認証モードを追加してなかった
対処
uvicorn 起動時にエラー No Kerberos credentials available
sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY000', '[HY000] [unixODBC][Microsoft][ODBC Driver 18 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000) (851968) (SQLDriverConnect)')
(Background on this error at: https://sqlalche.me/e/14/dbapi)
原因
- URL.query に "authentication": "ActiveDirectoryIntegrated", を突っ込んでいた
対処
- 上記を削除
uvicorn 起動時にエラー Login timeout expired
sqlalchemy.exc.OperationalError: (pyodbc.OperationalError) ('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
(Background on this error at: https://sqlalche.me/e/14/e3q8)
なんか色々あった・・Connection String は見直し必須。その上で以下かな
原因
- SQL Server Express の Port を固定していなかった?
対処
SQL Server Configuration Manager は以下から Install
最後に実際のデータ取得確認
DB に合わせて、以下を修正した上で・・
schemas.py
models.py
参考
確認用にLocalにSQL Server Express を入れる場合は以下
あとがき
ようやく、FastAPI で SQL Server のデータを取得出来るとこまできた・・
次は Database First で、Model の自動生成方法を・・かな
前