You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:42:07