summaryrefslogtreecommitdiff
path: root/src/database/__init__.py
blob: c1e229510dc3c1023dcf9f73b63282afc9caec79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from datetime import datetime, timezone
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapper
from sqlalchemy import event, update

class Base(DeclarativeBase, MappedAsDataclass):
    pass

db = SQLAlchemy(model_class=Base)

def init_db(app):
    migrate = Migrate(app, db)
    db.init_app(app)

@event.listens_for(Mapper, 'after_insert')
def insert_created_and_updated_at_columns(mapper, connection, target):
    set_timestamps = (
        update(mapper.local_table).
        where(mapper.local_table.c.id == target.id).
        values(created_at=datetime.now(timezone.utc),
               updated_at=datetime.now(timezone.utc))
    )
    connection.execute(set_timestamps)

@event.listens_for(Mapper, 'before_update')
def set_updated_at_timestamp(mapper, connection, target):
    set_updated_at = (
        update(mapper.local_table).
        where(mapper.local_table.c.id == target.id).
        values(updated_at=datetime.now(timezone.utc))
    )
    connection.execute(set_updated_at)