Skip to content

Convenience methods to create multiple models + associated API endpoints #166

@cisaacstern

Description

@cisaacstern

First Check

  • I added a very descriptive title to this issue.
  • I used the GitHub search to find a similar issue and didn't find it.
  • I searched the SQLModel documentation, with the integrated search.
  • I already searched in Google "How to X in SQLModel" and didn't find any information.
  • I already read and followed all the tutorial in the docs and didn't find an answer.
  • I already checked if it is not related to SQLModel but to Pydantic.
  • I already checked if it is not related to SQLModel but to SQLAlchemy.

Commit to Help

  • I commit to help with one of those options 👆

Example Code

# A reproducible repository which includes the proposed convenience objects 
# (and passes all the tests from the official tutorial):

    https://github.com/cisaacstern/sqlmodel-abstraction

# All of the proposed code lives in:

    https://github.com/cisaacstern/sqlmodel-abstraction/blob/main/project/abstractions.py

Description

The multiple models with inheritance design pattern is awesome. I would like to be able to implement it more concisely.

To achieve this, I've drafted a MultipleModels dataclass which takes base and response models as input, and generates the remaining (table, creation, and update) models programmatically; e.g., here. To register API endpoints for a given MultipleModels instance, it can be passed to the proposed register_endpoints convenience function; e.g., here.

The example repo for this feature proposal is a fully reproducible example project which passes all the same tests as the tutorial project in the SQLModel docs.

Wanted Solution

SQLModel currently provides other convenience methods (e.g., create_engine).

Whether it is via some version of the MutlipleModels and register_endpoints approach I've proposed, or some other methods, I would like to be have convenience methods that abstract away boilerplate code from the process of implementing the multiple models with inheritance design pattern.

Wanted Code

# This is an abbreviated `main.py` for a SQLModel project that uses the proposed features
# Full file: https://github.com/cisaacstern/sqlmodel-abstraction/blob/main/project/main.py

# Some imports omitted here

from sqlmodel import MultipleModels, register_endpoints

class HeroBase(SQLModel):
    name: str
    secret_name: str
    age: Optional[int] = None

class HeroRead(HeroBase):
    id: int

hero_models = MultipleModels(path="/heroes/", base=HeroBase, response=HeroRead)

# `engine` assignment and `get_session` definition omitted here

app = FastAPI()

register_endpoints(app, models=hero_models, get_session=get_session)

Alternatives

If this is out of scope for SQLModel, I would nonetheless greatly appreciate feedback on any pitfalls that may arise if I implement the proposed abstractions in production.

If this is within scope for SQLModel, I would happily adapt my example repo into a PR, if it seems like a good enough start.

Thanks in advance for your consideration.

Operating System

Linux, macOS

Operating System Details

No response

SQLModel Version

0.0.4

Python Version

>= 3.6, < 3.10

Additional Context

As noted in the example repo README, these ideas arose while exploring SQLModel for a database + API for Pangeo Forge.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions