0

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

DamDam
  • 119
  • 1
  • 15
  • 1
    After some research I found the cause : `from sqlalchemy import select` should be `from sqlmodel import select`. VsCode added the wrong library. – DamDam Nov 09 '22 at 08:14

0 Answers0