tortoise / tortoise/tortoise-orm
Discussion: tortoise.init() & TortoiseManager
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 5.6k
- Forks
- 516
- Avg merge
- 2d 21h
- Merged PRs (30d)
- 9
Description
I'm proposing start with an init handler like so:
def init(...) -> TortoiseManager
...
manager = tortoise.init(
modules=['app', 'app.sub'],
databases={
'default': <some db handler>,
'notes': <some db handler>
},
)
# Models are discoverable (and introspectable)
manager.models →
[<app.Projects>, <app.sub.Notes>, <app.sub.Tasks>]
# Actions are discoverable
manager.actions →
{
'tortoise': {
'syncdb': { describe itself and parameters here },
'makemigrations': ...,
'migrate': ....,
'info': ...
},
'app.sub': {
'import_tasks': ...
}
}
# Actions are executed
await manager.action('syncdb', param1=value1, ...)
# And then functionality useful for testing:
await manager.snapshot(...)
await manager.rollback(...)
await manager.teardown()
The TortoiseManager object would be a class that contains all the discovered models, and access to some management commands. (a bit like Django, but simpler at first).
Management action functions get the TortoiseManager object as an explicit parameter. The idea is to be able to do all introspection through a standard interface, to try and minimise incentive to access private functions.
We could do a tortoise shell command, which would be a wrapper around tortoise.init and TortoiseManager. We do it like that to allow any system it is embedded in to easily help manage it in their own tools.
For testing I would need the ability to tear-down, the tortoise environment, and handle both application-wide models, and test-local models. We can do something like:
from tortoise.testing import TortoiseTest
class TestThis(TortoiseTest):
<some config here>
...
Where it would automatically build a test db if models are test-local (and tear it down after the tests complete), or use the globally configured test database.
For our own testing we will probably use test-local models, and real application would probably use global models. So the use case should be optimised (ito convenience) for the global model use case, and test-local models can be a bit rough.
Automatic configuration will be quite important, so I propose a set of "sane" defaults, such as ability to use environment variables/config file to do init automatically.
For that to work we also need to have the ability to initialise databases off a single string.
eg. using URI schema like: https://github.com/kennethreitz/dj-database-url
Any comments/suggestions?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the proposed tortoise.init() entry point and the TortoiseManager and TortoiseTest concepts described in the issue. Before implementation, establish the API and scope for model discovery, management actions, database configuration, test teardown, snapshots, and rollback; done requires an agreed design and corresponding behavior, but no specific files or tests are identified here.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend-api-design, databases, testing
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 20/100