3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Windows で FastAPI で SQL Server のデータを利用する2

Last updated at Posted at 2022-10-14

背景

会社にて、FastAPI で、SQL Server の情報を利用する必要が生じたので、試行した記録

今回は以下

  1. SQLAlchemy
  2. ODBC Driver
  3. SQL Server アクセス

以下を参考に

SQLAlchemy インストール

install SQLAlchemy
pip3 install sqlalchemy

ODBC インストール

ドライバー一覧の確認

最初は入ってないと思うので、インストール後に確認用

ドライバー一覧
cat /etc/odbcinst.ini

基本は以下

WSL のバージョン確認

バージョン確認
lsb_release  -rs

pyodbc のインストール

pyodbc install
pip3 install pyodbc

ODBC Driver インストール

ODBC Install
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 のとこを実行すると以下な感じ
image.png

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 オープン
\\wsl$

FastAPI のチュートリアルに従って、sample app を準備する

基本は以下な感じ
image.png

準備したら、DB接続の確認へ

SQL Server への接続

チュートリアルでは、以下のように、sqlite 用になっているので、これを修正する必要がある

image.png

SQL Server 用の修正

ここからは、以下を参考に

SQL Server 用 database.py
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 起動
uvicorn fastapi_sample_app.main:app --reload

以下のように、フォルダ内で実行すると、下記のようなエラーが出るので注意

app フォルダで起動
uvicorn main:app --reload

attempted relative import with no known parent package

成功時

image.png

失敗の対処記録

SQL Server にログイン出来ない

原因

  • SQL Server Express で SQL Server 認証モードを追加してなかった :sweat_smile:

対処

  • 以下設定変更
    image.png

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", を突っ込んでいた :sweat_smile:

対処

  • 上記を削除

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 で設定して、Server 再起動
    image.png

SQL Server Configuration Manager は以下から Install

最後に実際のデータ取得確認

DB に合わせて、以下を修正した上で・・
schemas.py
models.py

無事、LinqPadと同じデータが取れることを確認
image.png

参考

確認用にLocalにSQL Server Express を入れる場合は以下

SQL Server 2019 express

あとがき

ようやく、FastAPI で SQL Server のデータを取得出来るとこまできた・・
次は Database First で、Model の自動生成方法を・・かな

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?