使用SQLAlchemy+PostgreSQL时,二次更新列值失败问题排查
问题:Todo项is_complete字段更新失效
我是后端开发新手,这是我的第一个全栈项目后端。数据库用PostgreSQL,部署在Render上,通过pgAdmin管理,只有一张TodoList表,包含id、task、is_complete三个字段。现在遇到的问题是:更新指定id的is_complete值时,第一次成功,再次更新就失效了——我需要实现前端点击checkbox时该字段在true和false之间切换。直接在pgAdmin里执行SQL可以多次更新,但通过Swagger UI调用PUT接口时,接口返回成功但数据库列值没变化,也没有报错信息,不知道怎么调试数据。
main.py
from fastapi import FastAPI, Depends from sqlalchemy.orm import Session from schemas import TodoSchemas import models from dbconnection import engine, get_db from fastapi.middleware.cors import CORSMiddleware import crud app = FastAPI() models.Base.metadata.create_all(bind=engine) origins = [ "http://localhost:3000", # Add your React development server URL "http://localhost:5173", # Add any other relevant URLs ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") def root(): return {"Data": "Working!"} @app.get("/allToDoList/", response_model=list[TodoSchemas.TodoList]) def read_todolist(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): todoList = crud.getAllTasks(db, skip=skip, limit=limit) return todoList @app.post("/todo", tags=["todos"]) def createTodo(todo:TodoSchemas.TodoListBase,db:Session=Depends(get_db)): return crud.createNewTask(todo=todo,db=db) @app.put("/todo/{id}", tags=["todos"]) def update_todo(id: int, db:Session=Depends(get_db)) -> bool: return crud.updateTask(db=db,idToUpdate=id) @app.delete("/todo/{id}", tags=["todos"]) def delete_todo(id: int, db:Session=Depends(get_db)) -> dict: return crud.deleteTask(db=db,idToDelete=id)
crud.py
def getAllTasks(db: Session, skip: int = 0, limit: int = 100): return db.query(models.TodoList).offset(skip).limit(limit).all() def createNewTask(todo:TodoSchemas.TodoListBase,db: Session): db_task = models.TodoList(task=todo.task) db.add(db_task) db.commit() db.refresh(db_task) return db_task # 存在问题的函数: def updateTask(db:Session, idToUpdate:int): todo = db.query(models.TodoList).filter_by(id=idToUpdate).first() if todo: try: todo.is_complete= not todo.is_complete db.commit() db.refresh(todo) return True except Exception as e: print(f"An error occurred: {e}") db.rollback() return False else: print(f"No todo item found with id {idToUpdate}.") return False def deleteTask(idToDelete:int,db:Session): id=db.query(models.TodoList).filter_by(id=idToDelete).delete() if id>0: db.commit() return { "message": f"{id} Task with ID {idToDelete} deleted successfully" } else: return {"message": f"Id: {idToDelete} was not found in the list "}
models.py
from sqlalchemy import Boolean, Column, Integer, String from dbconnection import Base class TodoList(Base): __tablename__ = "todolists" id = Column(Integer, primary_key=True, autoincrement=True, index=True) task = Column(String) is_complete = Column(Boolean)
TodoSchemas.py
from pydantic import BaseModel from sqlalchemy.orm import Session class TodoListBase(BaseModel): task:str class TodoList(TodoListBase): id: int is_complete: bool class Config: from_attributes=True
启动时的KeyboardInterrupt报错
每次应用启动完成前,控制台都会出现以下报错,不确定是否和更新问题相关:
File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\site-packages\uvicorn\_subprocess.py", line 78, in subprocess_started target(sockets=sockets) File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\site-packages\uvicorn\server.py", line 62, in run return asyncio.run(self.serve(sockets=sockets)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\annas\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 123, in run raise KeyboardInterrupt()
内容的提问来源于stack exchange,提问作者A j
相关产品推荐
相关产品推荐

