💨
【AI_6日目_2回目】FastAPI_1冊目
こんにちは投資ロウトです。
背景
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