从FastAPI的外键返回数据抛出greenlet错误



我试图通过FastAPI中的外键返回连接的数据,但当我在response_model中使用包含数据的类时,端点抛出greenlet错误。我正在使用FastAPI和SQLModel(我知道SQLModel关系和SQLAlchemy的错误,我降级到SQLAlchemy 1.4.35)。我的代码如下:

models.py

class BaseQuestion(SQLModel):
survey_id: Optional[int] = Field(default=None, foreign_key="survey.id")
title: Optional[str] = Field(default=None, max_length=45)
help: Optional[str] = Field(default=None, max_length=45)
priority: Optional[int] = Field(default=None)
is_mandatory: Optional[int] = Field(default=None)

class Question(BaseQuestion, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
answers: List["Answer"] = Relationship(back_populates="question")
survey: Optional[Survey] = Relationship(back_populates="questions")
class QuestionOut(BaseQuestion):
id: Optional[int] = Field(default=None, primary_key=True)

class BaseAnswer(SQLModel):
question_id: Optional[int] = Field(default=None, foreign_key="question.id")
text: Optional[str] = Field(default=None, max_length=45)
help: Optional[str] = Field(default=None, max_length=45)
priority: Optional[str] = Field(default=None, max_length=45)
is_stoping: Optional[int] = Field(default=0)

class Answer(BaseAnswer, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
question: Optional[Question] = Relationship(back_populates="answers")

class AnswerOut(BaseAnswer):
id: Optional[int] = Field(default=None, primary_key=True)

class QuestionWithAnswer(QuestionOut):
answers: List[Answer] = []

api.py

@app.get("/questions/{question_id}", response_model=questionnaire.QuestionOut)
async def get_question(question_id: int, session: db.Session = Depends(session)):
db_question = await session.get(questionnaire.Question, question_id)
if not db_question:
raise HTTPException(status_code=404, detail="Question not found")
return db_question

db.py

def create_engine(host: str, username: str, password: str, name: str) -> AsyncEngine:
return create_async_engine(
URL.create(
drivername="mariadb+aiomysql",
host=host,
username=username,
password=password,
database=name,
),
)

def session_factory(app: FastAPI) -> Callable:
async def session() -> AsyncGenerator[Session, None]:
async with Session(app.state.engine) as session:
yield session
return session

错误是:

concurrency_py3k.py", line 67, in await_only
survey-service-1  |     raise exc.MissingGreenlet(
survey-service-1  | sqlalchemy.exc.StatementError: (sqlalchemy.exc.MissingGreenlet) greenlet_spawn has not been called; can't call await_() here. Was IO attempted in an unexpected place?
survey-service-1  | [SQL: SELECT answer.question_id AS answer_question_id, answer.text AS answer_text, answer.help AS answer_help, answer.priority AS answer_priority, answer.is_stoping AS answer_is_stoping, answer.id AS answer_id 
survey-service-1  | FROM answer 
survey-service-1  | WHERE %s = answer.question_id]
survey-service-1  | [parameters: [{'%(140173137451136 param)s': 1}]]
survey-service-1  | (Background on this error at: https://sqlalche.me/e/14/xd2s)

最后,我找到了解决方案https://github.com/tiangolo/sqlmodel/issues/74

最新更新