1

既存の MySQL データベースを備えた FastAPI アプリがあり、Tortoise ORM を使用しようとしています。(簡略化された) メインの FastAPI ファイルは次のようになります。

from fastapi import FastAPI
import os
from tortoise.contrib.fastapi import register_tortoise

# Register FastAPI main app
app = FastAPI(title="my_app")


# Database
DATABASE_URL = "mysql://{}:{}@{}:{}/{}".format(
    os.environ["MYSQL_USER"],
    os.environ["MYSQL_PASSWORD"],
    os.environ.get("MYSQL_HOST", "127.0.0.1"),
    os.environ.get("MYSQL_PORT", "3306"),
    os.environ.get("MYSQL_DB", "my_db"),
)

# Register Tortoise ORM with DB
register_tortoise(
    app,
    db_url=DATABASE_URL,
    modules={"models": ["models"]},
    generate_schemas=False,
    add_exception_handlers=True,
)


# Test SQL query
from models import Store
print(Store.get(api_key="api_key"))

...そして、同じベース ディレクトリ レベルにある models.py ファイルは次のようになります。

from tortoise import fields
from tortoise.models import Model


class Store(Model):
    api_key = fields.CharField(max_length=64, db_index=True)
    name = fields.CharField(max_length=255)

    def __str__(self):
        return self.name

    class Meta:
        table = "stores"

ただし、Tortoise ORM からエラーが発生します。

  File ".../site-packages/tortoise/models.py", line 265, in db
    raise ConfigurationError("No DB associated to model")
tortoise.exceptions.ConfigurationError: No DB associated to model

理由はありますか?

私はドキュメント(https://tortoise-orm.readthedocs.io/en/latest/contrib/fastapi.html)に従っていますが、「モデル用に検出する必要があるモジュール」のパス/構文はあまり明確ではありません. また、モデルを に登録しようとしpydantic_model_creatorましたが、ドキュメントではなぜそれが必要なのか明確ではありません ( https://tortoise-orm.readthedocs.io/en/latest/examples/fastapi.html#example-fastapi )。によってロードされたconfig.jsonの完全な構成ファイルを使用したくないのregister_tortoiseですが、ドキュメントによるとオプションのようです。

4

2 に答える 2

0

この問題は、FastAPI と Tortoise ORM の非同期性に起因していました。FastAPI がロードされ、Tortoise がモデルを登録するのを待つ必要があります。

したがって、次のように、FastAPI のロードと Tortoise ORM のリクエストを待機する非同期リクエストを正常に実行できます。

# Test SQL query
from models import Store

@app.on_event("startup")
async def startup():
    print(await Store.get(api_key="api_key"))
于 2020-11-27T08:39:54.100 に答える