I'm using SQLModel on my project with FastAPI. All worked perfectly until my requests "lost" their attributes.
On another file with similar code, I can access attributes simply using subtask.order_nb
as show in the SQLModel documentation.
But now, I can only access using subtask._data[0].order_nb
which is not the best way to handle this. If I try to change attributes "order_nb" I get an error
raise AttributeError("can't set attribute")
AttributeError: can't set attribute
Here the model for "Subtask"
class Subtask(SQLModel, table=True):
subtask_id:int = Field(default=None, primary_key=True)
subtask_key:str = Field(default=None, nullable=False)
subtask_status:str = Field(sa_column=Column(Enum(SubtaskStatus)), nullable=False)
order_nb:int = Field(default=None, nullable=False)
gitlab_project_name:str = Field(default=None, nullable=False)
gitlab_project_id:int = Field(default=None, nullable=False)
fk_issue_id:int = Field(default=None, foreign_key="issue.issue_id", nullable=False)
Here my fastAPI code:
from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlmodel import func
from sqlmodel import Session
from interfaces.gitlab import GitlabResponse
from jira.service import change_subtask_status, change_issue_status
from jira.models import Subtask, Issue, IssueStatus
from db import get_session
router = APIRouter()
@router.post("/gitlab_callbacks")
async def get_gitlab_callbacks(request: GitlabResponse, session: Session = Depends(get_session)):
print(request)
statement = select(Subtask).where(Subtask.subtask_id == request.subtask_id)
subtask = session.exec(statement).first()
db.py
import os
from sqlmodel import SQLModel, Session, create_engine
#import models # Imported models will be created with SQL Engine
from deployments import models
from jira import models
from jira.models import Issue, Subtask
from dotenv import load_dotenv
load_dotenv()
engine = create_engine(os.environ.get("DATABASE_URL"), echo=False, future=True)
def init_db():
"""Initialize SQL engine"""
if os.environ.get('MODE') == 'DEV':
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)
def get_session() -> Session:
"""Get the SQL engine session"""
with Session(engine) as session:
return session
I don't know where I made a mistake.
Thanks for your help