46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
from sqlalchemy import Column, String, DateTime
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy.sql import func
|
|
from core.database import Base
|
|
import uuid
|
|
from typing import Optional
|
|
|
|
class Book(Base):
|
|
__tablename__ = "books"
|
|
|
|
# Primary key using UUID
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
|
|
# Book details
|
|
title = Column(String, nullable=False, index=True)
|
|
author = Column(String, nullable=False, index=True)
|
|
|
|
# Timestamps
|
|
created_at = Column(DateTime, default=func.now())
|
|
updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
|
|
|
|
@classmethod
|
|
def update_book(cls, db_session, book_id: uuid.UUID, book_update) -> Optional["Book"]:
|
|
"""
|
|
Update an existing book record in the database using the BookUpdate schema.
|
|
|
|
Args:
|
|
db_session: The database session
|
|
book_id: UUID of the book to update
|
|
book_update: BookUpdate schema instance with fields to update
|
|
|
|
Returns:
|
|
Updated Book instance or None if book not found
|
|
"""
|
|
book = db_session.query(cls).filter(cls.id == book_id).first()
|
|
if not book:
|
|
return None
|
|
|
|
# Update book attributes from the update schema
|
|
update_data = book_update.dict(exclude_unset=True)
|
|
for key, value in update_data.items():
|
|
setattr(book, key, value)
|
|
|
|
db_session.commit()
|
|
db_session.refresh(book)
|
|
return book |