You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
1.4 KiB

1 year ago
import datetime
from typing import Optional
import sqlalchemy.types as types
from sqlalchemy import Column, text, MetaData
from sqlalchemy.orm import declarative_base
meta = MetaData(naming_convention={
"ix": "ix_%(column_0_label)s",
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}, schema=None)
Base = declarative_base(metadata=meta) # type: ignore
class BaseModel(Base):
__abstract__ = True
id = Column(types.Integer, nullable=False, unique=True, primary_key=True, autoincrement=True)
created_at = Column(
types.TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP')
)
updated_at = Column(
types.TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'), onupdate=text('CURRENT_TIMESTAMP')
)
__mapper_args__ = {"eager_defaults": True}
@property
def created_at_timestamp(self) -> int:
return int(self.created_at.timestamp())
@property
def updated_at_timestamp(self) -> int:
return int(self.updated_at.timestamp())
def set_updated_at(self, date_time: Optional[datetime.datetime] = None) -> None:
if date_time:
self.updated_at = date_time
else:
self.updated_at = datetime.datetime.now()