feat: database with tortoise orm
Python Lint CI / ty (push) Successful in 1m22s
Python Lint CI / ruff (push) Successful in 1m22s
Python Lint CI / ruff-format-check (push) Successful in 1m22s

This commit is contained in:
2026-07-01 11:43:10 +02:00
parent deba8a73f9
commit c93a74b0f4
14 changed files with 248 additions and 1 deletions
+2
View File
@@ -2,6 +2,7 @@ import logging
import sys
from app import PKG_NAME, PKG_VERSION
from app.database import Database
from app.logs import setup_logs
from app.params import parse_parameters
from app.server import Server
@@ -11,5 +12,6 @@ def main() -> int:
params = parse_parameters(sys.argv[1:])
setup_logs(params)
logging.getLogger().info("%s %s", PKG_NAME, PKG_VERSION)
Database(params).init()
Server(params).register_routes().start()
return 0
+33
View File
@@ -0,0 +1,33 @@
import logging
import typing
import tortoise
import tortoise.config
import tortoise.migrations.api
if typing.TYPE_CHECKING:
from app.params import Parameters
class Database:
def __init__(self, params: Parameters) -> None:
self.env = params.env
self.logger = logging.getLogger(self.__class__.__name__)
self.config = tortoise.config.TortoiseConfig(
connections={"default": tortoise.config.DBUrlConfig(params.db_url)},
apps={
"models": tortoise.config.AppConfig(
models=["app.models"],
default_connection="default",
migrations="app.migrations",
)
},
)
def init(self) -> typing.Self:
self.logger.info("Initializing database")
tortoise.run_async(tortoise.Tortoise.init(config=self.config))
self.logger.info("Migrating database")
tortoise.run_async(tortoise.migrations.api.migrate(config=self.config))
self.logger.info("Database ready")
return self
+21
View File
@@ -0,0 +1,21 @@
from tortoise import migrations
from tortoise.migrations import operations as ops
from uuid import uuid4
from tortoise import fields
class Migration(migrations.Migration):
initial = True
operations = [
ops.CreateModel(
name='Comment',
fields=[
('id', fields.UUIDField(primary_key=True, default=uuid4, unique=True, db_index=True)),
('created_at', fields.DatetimeField(auto_now=False, auto_now_add=True)),
('updated_at', fields.DatetimeField(auto_now=True, auto_now_add=False)),
('content', fields.TextField(unique=False)),
],
options={'table': 'comment', 'app': 'models', 'pk_attr': 'id'},
bases=['AbstractModel'],
),
]
View File
+1
View File
@@ -0,0 +1 @@
from .comment import Comment # noqa: F401
+11
View File
@@ -0,0 +1,11 @@
import tortoise
import tortoise.models
class AbstractModel(tortoise.models.Model):
id = tortoise.fields.UUIDField(primary_key=True)
created_at = tortoise.fields.DatetimeField(auto_now_add=True)
updated_at = tortoise.fields.DatetimeField(auto_now=True)
class Meta:
abstract = True
+7
View File
@@ -0,0 +1,7 @@
import tortoise
from app.models.base import AbstractModel
class Comment(AbstractModel):
content = tortoise.fields.TextField()
+8
View File
@@ -15,6 +15,7 @@ class Parameters:
port: int = 5000
workers: int = 4
timeout: int = 120
db_url: str = "postgres://postgres:5432/tout-doux"
@classmethod
def from_namespace(cls, args: argparse.Namespace) -> Parameters:
@@ -112,5 +113,12 @@ def parse_parameters(args: typing.Sequence[str]) -> Parameters:
default=default_values.timeout,
help_txt="WSGI timeout",
)
__add_arg_str(
parser,
"--db-url",
env_var="DB_URL",
default=default_values.db_url,
help_txt="database connection url",
)
parsed_args = parser.parse_args(args)
return Parameters.from_namespace(parsed_args)