feat: database with tortoise orm
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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'],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
from .comment import Comment # noqa: F401
|
||||
@@ -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
|
||||
@@ -0,0 +1,7 @@
|
||||
import tortoise
|
||||
|
||||
from app.models.base import AbstractModel
|
||||
|
||||
|
||||
class Comment(AbstractModel):
|
||||
content = tortoise.fields.TextField()
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user