Adam Wainwright has dominated the Rockies like no other pitcher in 25 years. And he did it again.

The 66 mph curveball from the right hand of Cardinals pitcher Adam Wainwright swerved toward Carlos Gonzalez like a haymaker. It spun him around and back toward the dugout. How are you supposed to hit a pitch so soft, let alone very far?

“That curve is sharp and nasty,” Rockies first baseman Mark Reynolds said. “It doesn’t matter how hard he throws, as long as he has that curve in his back pocket.”

The Cardinals veteran, now 35 years old but still a master manipulator of aerodynamics, whiffed the Rockies for seven stellar, shutout innings Saturday in front of a packed-house crowd of 48,106 as St. Louis sprinted to a 3-0 victory.

In the Rockies’ 25-year history, no pitcher has dominated them more thoroughly, in or out of Coors Field, than Wainwright. Over 15 games, he has compiled a 10-1 record and a 1.56 ERA over 81 innings against Colorado. That is the lowest ERA against the Rockies by an opposing pitcher in club history.

BOX SCORE: Cardinals 3, Rockies 0

His seven scoreless innings shut down a streaking Colorado offense that had scored 60 runs in its past eight games, a 7.5 average. The Rox of late are a juggernaut of timely singles and long home runs, a lineup that routed the Cardinals 10-0 Friday night.

“His curve,” Reynolds said, “you have to be patient with it, wait him out, hopefully he makes mistakes. Doesn’t make too many.”

Wainwright slammed that roll to a stop. He gave up consecutive singles to Ian Desmond and Trevor Story in the second inning and another to Desmond in the fourth. And he walked Reynolds before Desmond. That was it for Colorado (32-19). With a confident curveball and the smarts to pepper it appropriately, Wainwright saw just seven baseballs even leave the infield. He struck out six and walked one.

“What I love about him, and I like this about all veteran players, they’ve passed the test of time with great performance,” Colorado manager Bud Black said. Wainwright, who appeared in his 330th game, the 10th-most games pitched in the Cardinals’ 136-year history, moved his career record to 139-79.

“He’s been a stellar starting pitcher in this league for a long time,” Black said. “He knows how to get his outs. His stuff is maybe not where it was five, six, seven, eight years ago. But he’s still a capable starting pitcher. He knows how to work his way through a 2 1/2-hour game.”

St. Louis (24-22) got a run-scoring single from catcher Yadier Molina in the third, when he poked a hit to right field through a gap left open by Colorado’s defensive shift, that scored Dexter Fowler. And St. Louis left fielder Tommy Pham floated a home run to the left-field seats in the fifth that scored Fowler for a three-run lead.

Starting pitcher Kyle Freeland #31 of ...

Justin Edmonds, Getty Images

Starting pitcher Kyle Freeland of the Colorado Rockies reacts after giving up a home run to Tommy Pham of the St Louis Cardinals delivers to home plate at Coors Field on May 27, 2017 in Denver.

Rockies rookie Kyle Freeland, pitching in his 10th career game, was leading the National League in groundballs, forcing 63.5 percent of outs in the infield. As such, he allowed just four home runs in his nine starts, including just one at Coors Field. Pham’s homer, though, took advantage of a belt-high slider inside, a breaking ball that did not break enough.

Freeland gave up three runs on eight hits over six innings, while striking out four with two walks. He forced Wainwright into a 1-2-3 double play to end the fourth, and retired the final six batters he faced. His takeaway, though, was watching Wainwright’s advanced class in pitch mixes.

“Absolutely. His composure was impeccable,” Freeland said of Wainwright. “He filled up the zone. He got the ball on the ground. He was only in one jam, and that was with two outs. You can definitely learn from somebody like that.”

The Rockies loaded the bases in the eighth after Cardinals reliever Trevor Rosenthal, suddenly throwing 100 mph fastballs after Wainwright’s sub-70s stuff, walked Nolan Arenado. But Gonzalez grounded out to second to snuff the threat.

“I’d been seeing off-speed all night (from Wainwright),” Gonzalez said. “You have that in the back of your mind. This guy (Rosenthal) throws 100. But I don’t know if he’s going to challenge me. And he did. I swung late.”

Wainwright won an eighth consecutive game against the Rockies. Even at Coors Field, where pitchers bite their nails to nubs worrying about the expanse of outfield at altitude, Wainwright is now 4-0 with a 2.21 ERA.

“He’s smart. It’s why he’s still in the game. And he’s not afraid to pitch here,” Gonzalez said. “It’s one of those baseball things, it’s hard to explain. But he knows how to get this team out.”