@app.on_event("startup") asyncdefstartup(): global pool pool = await asyncpg.create_pool( user="postgres", password="postgres", database="testdb", host="localhost", port=5432, min_size=5, max_size=20 ) # 自动创建表 asyncwith pool.acquire() as conn: await conn.execute(""" CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, age INTEGER NOT NULL, created_at TIMESTAMP DEFAULT NOW() ) """)
@app.on_event("shutdown") asyncdefshutdown(): if pool: await pool.close()
@app.get("/users", response_model=List[UserResponse]) asyncdeflist_users(conn=Depends(get_db)): rows = await conn.fetch("SELECT * FROM users ORDER BY id") return [UserResponse.model_validate(dict(row)) for row in rows]
@app.get("/users/{user_id}", response_model=UserResponse) asyncdefget_user(user_id: int, conn=Depends(get_db)): row = await conn.fetchrow("SELECT * FROM users WHERE id = $1", user_id) ifnot row: raise HTTPException(status_code=404, detail="User not found") return UserResponse.model_validate(dict(row))
@app.put("/users/{user_id}", response_model=UserResponse) asyncdefupdate_user(user_id: int, user: UserUpdate, conn=Depends(get_db)): # 动态构建 UPDATE 语句,只更新提供的字段 update_fields = {k: v for k, v in user.model_dump(exclude_none=True).items()} ifnot update_fields: raise HTTPException(status_code=400, detail="No fields to update") set_clause = ", ".join([f"{k} = ${i+1}"for i, k inenumerate(update_fields.keys())]) values = list(update_fields.values()) + [user_id] row = await conn.fetchrow( f"UPDATE users SET {set_clause} WHERE id = ${len(values)} RETURNING *", *values ) ifnot row: raise HTTPException(status_code=404, detail="User not found") return UserResponse.model_validate(dict(row))
@app.delete("/users/{user_id}", status_code=204) asyncdefdelete_user(user_id: int, conn=Depends(get_db)): result = await conn.execute("DELETE FROM users WHERE id = $1", user_id) if result == "DELETE 0": raise HTTPException(status_code=404, detail="User not found")
{ "detail":[ { "type":"int_parsing", "loc":["body","age"], "msg":"Input should be a valid integer, unable to parse string as an integer", "input":"30" } ] }