Flask-Tortoise
Flask-Tortoise is an extension for Flask that adds support for asynchronous Tortoise-ORM to your application with in-built migration system. It aims to simplify using Tortoise-ORM with Flask by providing useful defaults and extra helpers that make it easier to accomplish common tasks.
Tortoise-ORM is one of the best tool to interact with the database asynchronously. It's clean and Django type implementation provides you a better view and understanding of the database ORM system. Also you can use the Pydantic data module to write the error-less code.
The main aim of Tortoise-ORM is to provide the same service and api like the Django-ORM.
Installing
Install and update from PYPI:
pip install -U Flask-Tortoise
Install from source code:
git clone https://github.com/marktennyson/Flask-Tortoise
cd Flask-Tortoise && pip install .
Important links
Github Link: https://github.com/marktennyson/Flask-Tortoise
Official Documentation: https://marktennyson.github.io/Flask-Tortoise
Simple Examples for better understanding:
from flask import Flask, jsonify
from flask_tortoise import Tortoise
from random import choice
STATUSES = ["New", "Old", "Gone"]
app:"Flask" = Flask(__name__)
app.config['TORTOISE_ORM_DATABASE_URI'] = 'sqlite://db.sqlite3'
db:"Tortoise" = Tortoise(app)
class Users(db.Model):
id = db.IntField(pk=True)
status = db.CharField(20)
def __str__(self):
return f"User {self.id}: {self.status}"
class Workers(db.Model):
id = db.IntField(pk=True)
status = db.CharField(20)
def __str__(self):
return f"Worker {self.id}: {self.status}"
@app.get("/")
async def list_all():
users = await Users.all()
workers = await Workers.all()
return jsonify(
{"users": [str(user) for user in users], "workers": [str(worker) for worker in workers]}
)
@app.get("/user")
async def add_user():
user = await Users.create(status=choice(STATUSES)) # nosec
return str(user)
@app.get("/worker")
async def add_worker():
worker = await Workers.create(status=choice(STATUSES)) # nosec
return str(worker)
@app.get("/get-worker")
async def get_worker():
worker:"Workers" = await Workers.get(id=1)
return str(worker.status)
if __name__ == '__main__':
app.run(debug=True, port=8080)
If you save your models into a separate file than you have mention the file name on app config:
let's assume you have stores all of your models at models.py file.
models.py file
from flask_tortoise import Tortoise, Model, fields
db:"Tortoise" = Tortoise()
class Users(db.Model):
id = db.IntField(pk=True)
status = db.CharField(20)
def __str__(self):
return f"User {self.id}: {self.status}"
class Workers(db.Model):
id = db.IntField(pk=True)
status = db.CharField(20)
def __str__(self):
return f"Worker {self.id}: {self.status}"
app.py file:
from flask import Flask, jsonify
from models import *
from random import choice
STATUSES = ["New", "Old", "Gone"]
app:"Flask" = Flask(__name__)
app.config['TORTOISE_ORM_DATABASE_URI'] = 'sqlite://db.sqlite3'
app.config['TORTOISE_ORM_MODELS'] = "models" # if you have more than one models file then : ["models_1", "models_2", "models_3"]
db.init_app(app)
@app.get("/")
async def list_all():
users = await Users.all()
workers = await Workers.all()
return jsonify(
{"users": [str(user) for user in users], "workers": [str(worker) for worker in workers]}
)
@app.get("/user")
async def add_user():
user = await Users.create(status=choice(STATUSES)) # nosec
return str(user)
@app.get("/worker")
async def add_worker():
worker = await Workers.create(status=choice(STATUSES)) # nosec
return str(worker)
@app.get("/get-worker")
async def get_worker():
worker:"Workers" = await Workers.get(id=1)
return str(worker.status)
if __name__ == '__main__':
app.run(debug=True, port=8080)
Contributing:
We welcome all types of contributions. If you face any issue while using this module then please let us know by creating a github issue on the official github repo. If you have the solution for the issue raised by you or somebody else then please fork this repo and create a pull request with the main branch.
How to run this project on local machine:
- Fork this repo.
- Clone this repo on your local machine.
- create a virtual environment using python
virtualenvmodule and activate it. - now run
python setup.py install. - the above command will install the latest dev version of
Flask-Tortoiseon the virtual environment.
Contributor List:
License
GNU General Public License v3 or later (GPLv3+)
Copyright (c) 2021 Aniket Sarkar(aniketsarkar@yahoo.com)
Metadata
Release files for Flask-Tortoise 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| Flask-Tortoise-0.0.2.tar.gz | 28.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| Flask_Tortoise-0.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.3 kB
Release files / Flask-Tortoise-0.0.2.tar.gz
| Download URL | Flask-Tortoise-0.0.2.tar.gz |
|---|---|
| Size | 28.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd87d2990485fabaeb24d88284c765fbff7838f11f131cc03a8c10e49c32a8f5
|
|
BLAKE2b-256 checksum How to use checksums |
22c5b05ea1ae9ff5b1392c5cd0f0d1b79c04e7cabc77bf67b940d6bb71580f90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.4.2 requests/2.25.1 setuptools/45.2.0 requests-toolbelt/0.8.0 tqdm/4.61.1 CPython/3.8.10
|
Release files / Flask_Tortoise-0.0.2-py3-none-any.whl
| Download URL | Flask_Tortoise-0.0.2-py3-none-any.whl |
|---|---|
| Size | 27.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1df4540761a5c9531481d8e0220f9117feee6548e341b7bbd6b30e43d1934bfe
|
|
BLAKE2b-256 checksum How to use checksums |
c7b979dfb6a8a19511dbe32bbf782678c5254ff8cff8d6bbda631f951986bc1f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.4.2 requests/2.25.1 setuptools/45.2.0 requests-toolbelt/0.8.0 tqdm/4.61.1 CPython/3.8.10
|