Tortoise (async)
When generating routes, the TortoiseCRUDRouter
will automatically tie into
your database using your Tortoise models. To use it, you must pass a
pydantic schema, your Tortoise database model to it, and register Tortoise ORM with your FastAPI App.
Warning
To use the TortoiseCRUDRouter
, Tortoise ORM must be first installed.
Simple Example
Below is an example assuming that you have already imported and created all the required models.
app = FastAPI()
register_tortoise(app, config=TORTOISE_ORM)
router = TortoiseCRUDRouter(
schema=MyPydanticModel,
db_model=MyDBModel,
prefix="test"
)
app.include_router(router)
You can provide your TORTOISE_ORM from a file or as a dictionary. If you want to provide it as a dictionary, this would be how:
TORTOISE_ORM = {
"connections": {"default": 'postgres_url_here'},
"apps": {
"models": {
"models": ["example"],
"default_connection": "default",
},
},
}
Where "models": ["example"]
represents that example.py
is where your Tortoise database ORM models are located.
If you ended up having a lot of these, you might want to break it out into a models.py
file and thus your config would change to "models": ["models"]
.
If you use Aerich for database migrations, you'll need to add "aerich.models"
to your config.
Note
The create_schema
should not include the primary id field as this should be generated by the database. If you don't provide a create_schema, a primary key stripped schema will be made for you.
Full Example
# example.py
import uvicorn as uvicorn
from fastapi import FastAPI
from fastapi_crudrouter.core.tortoise import TortoiseCRUDRouter
from tortoise.contrib.fastapi import register_tortoise
from tortoise.contrib.pydantic import pydantic_model_creator
from tortoise.models import Model
from tortoise import fields, Tortoise
TORTOISE_ORM = {
"connections": {"default": 'postgres_url'},
"apps": {
"models": {
"models": ["example"],
"default_connection": "default",
},
},
}
# Create Database Tables
async def init():
await Tortoise.init(config=TORTOISE_ORM)
await Tortoise.generate_schemas()
app = FastAPI()
register_tortoise(app, config=TORTOISE_ORM)
# Tortoise ORM Model
class TestModel(Model):
test = fields.IntField(null=False, description=f"Test value")
ts = fields.IntField(null=False, description=f"Epoch time")
# Pydantic schema
TestSchema = pydantic_model_creator(TestModel, name=f"{TestModel.__name__}Schema")
TestSchemaCreate = pydantic_model_creator(TestModel, name=f"{TestModel.__name__}SchemaCreate", exclude_readonly=True)
# Make your FastAPI Router from your Pydantic schema and Tortoise Model
router = TortoiseCRUDRouter(
schema=TestSchema,
create_schema=TestSchemaCreate,
db_model=TestModel,
prefix="test"
)
# Add it to your app
app.include_router(router)
if __name__ == "__main__":
uvicorn.run("example:app", host="127.0.0.1", port=5000, log_level="info")