💨

【AI_6日目_2回目】FastAPI_1冊目

2024/09/07に公開

こんにちは投資ロウトです。

背景

AI開発ができるためにwebAPIについて理解を深めていきます。
※Tailwind CSSとkeycloakは現場でピンチになれば再開します。

ORMライブラリを使う

NodejsにTypeOrmがあるように、Pythonにもsqlalchemyと言うORMライブラリをMySQLの接続のために使うとのことです。
※他にもPeeweeと言うものにも対応しているとのことです。

クライアントツールには、pymysqlを使うといいとのことです。

アプリが起動した段階で、それらのライブラリを入れるとのことです。

# まずは起動
docker compose up

# 起動後に実行
docker compose exec アプリ名 poetry add sqlalchemy pymysql

api/db.pyにアクセスクラスを用意する。

api/models/stock.pyにテーブル定義を書いていく
本当にシンプルな構成になっています。

from sqlalchemy import Column, Integer, String

from api.db import Base

class Stock(Base):
    __tablename__ = 'stocks'
    
    id = Column(Integer, primary_key=True)
    stock_name = Column(String(100))

api/migrate_db.pyでマイグレーション用を作成していく。

from sqlalchemy import create_engine

from api.models.stock import Base

DB_URL = "mysql+pymysql://root@db:3306/demo?charset=utf8"
engine = create_engine(DB_URL, echo=True)

def reset_database():
    Base.metadata.drop_all(bind=engine)
    Base.metadata.create_all(bind=engine)

if __name__ == "__main__":
    reset_database()

先にテーブルの中身を確認する(テーブルを作成する前)

show tables;

その後マイグレーションを実行する

docker compose exec アプリ名 poetry run python -m マイグレーションファイル.py

エラーが発生

    self.connect()
  File "/src/.venv/lib/python3.11/site-packages/pymysql/connections.py", line 669, in connect
    self._request_authentication()
  File "/src/.venv/lib/python3.11/site-packages/pymysql/connections.py", line 957, in _request_authentication
    auth_packet = self._read_packet()
                  ^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.11/site-packages/pymysql/connections.py", line 775, in _read_packet
    packet.raise_for_error()
  File "/src/.venv/lib/python3.11/site-packages/pymysql/protocol.py", line 219, in raise_for_error
    err.raise_mysql_exception(self._data)
  File "/src/.venv/lib/python3.11/site-packages/pymysql/err.py", line 150, in raise_mysql_exception
    raise errorclass(errno, errval)
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'172.19.0.3' (using password: NO)")
(Background on this error at: https://sqlalche.me/e/20/e3q8)

パスワードを入れていなかったのが、どうやら要因のよう。以下のようにパスワードを入れてみる。

DB_URL = "mysql+pymysql://root:<password>@db:3306/demo?charset=utf8"

再度実行

どうやら成功。MySQLにアクセスして確認してみる。

作成されていた。

と短いですが、一旦以上で学習を区切りたいと思います。ご精読ありがとうございました。焦らずコツコツ進めていきたいと思います。

Discussion