The world champion pipped his Belgian rival to the win last year, and sprinted convincingly ahead of him on the final straight of this year’s 201.6km race in Québec City.
Australian Michael Matthews (Sunweb) was able to sprint home behind the leading two for third place.
The race had begun quickly with the main breakaway, as Tyler Williams (Israel Cycling Academy), Pier-André Coté (Canada), Tosh Van der Sande (Lotto-Soudal) and Baptiste Planckaert (Katusha-Alpecin) formed break, getting away within the first few kilometres and establishing a maximum gap of almost 10 minutes.
By the time the race reached just under 30km to go, only Planckaert and Van der Sande remained with 1-40 on the chasing bunch.
With just over two laps to go on the final climbs of the 12.6km circuit, a splinter group of around 10 riders tried to get away but weren’t given much space and were quickly reeled in by the likes of Bora-Hansgrohe, BMC and Orica-Scott.
Planckaert was eventually left to try and hold the bunch off solo with 21km to go after van der Sande fell away, but his efforts were in vain and he was recalled to the bunch with 16km left.
As they reached he final lap, Kenny Elissonde (Team Sky) went off on his own, but he too wasn’t given much leeway and was quickly dragged back by the pursuers.
Rigoberto Uran (Cannondale-Drapac) then tried to attack within the final kilometre on the last uphill slopes, but was held tightly by the front of the bunch which was setting things up for a sprint finish.
As the riders rounded the final bend and opened onto the straight towards the line, Sagan was able to ride the wheels of those already unleashing their sprints, before he was able to launch his own sprint in earnest on the right hand side of the road with 100m remaining.
Fellow race favourite Van Avermaet was latched onto his wheel, but wasn’t able to do anything to stop Sagan for the second year in succession at the GP Québec.
The riders will gather again for another Canadian one-day race in Montréal for a 205.7km route within the city.
Grand Prix Cycliste de Québec (201.6km)
1 Peter Sagan (Svk) Bora-Hansgrohe, in 5-00-31
2 Greg Van Avermaet (Bel) BMC Racing
3 Michael Matthews (Aus) Team Sunweb
4 Alexis Vuillermoz (Fra) Ag2r La Mondiale
5 Tim Wellens (Bel) Lotto-Soudal
6 Tom-Jelte Slagter (Ned) Cannondale-Drapac
7 Petr Vakoc (Cze) Quick-Step Floors
8 Sep Vanmarcke (Bel) Cannondale-Drapac
9 Tony Gallopin (Fra) Lotto-Soudal
10 Sonny Colbrelli (Ita) Bahrain-Merida, all same time