Grichuk and Jhonny Peralta had two RBIs each for the Cardinals, who are a major league-best 30-16. Garcia (1-1) hadn't won since June 15 at home against the Nationals.
Rookie Yasmany Tomas had two doubles and three RBIs for Arizona, but also made two big outs. He struck out against Matt Belisle with the bases loaded to end the seventh and hit a ground ball for the final out with the tying runs in scoring position against Seth Maness, who earned his third save in four chances.
Nick Ahmed homered for the Diamondbacks, who have lost eight of their last nine against St. Louis.
Matt Holliday had an RBI single and double and has reached safely in 42 consecutive games to start the season, matching former teammate Albert Pujols (2008) for the longest streak in the majors since 2000.
Garcia was more impressive in his season debut coming off thoracic outlet surgery to alleviate numbness and tingling in his left arm and hand. He allowed two runs in seven innings in a 5-0 loss to the Mets in New York last week.
In his second start, the lefty allowed three earned runs, and got a lot more support.
Archie Bradley (2-2) allowed six runs in 3 2-3 innings for Arizona, the third straight tough start coming off the 15-day disabled list after taking a line drive in the face by Colorado's Carlos Gonzalez on April 28. Bradley, who sustained a right sinus fracture, has surrendered 14 runs in 10 2-3 innings in that stretch.
Diamondbacks: Reliever David Hernandez (elbow surgery) is scheduled to throw for Double-A Mobile Wednesday.
Cardinals: Lefty Marco Gonzales, pitching at Triple-A Memphis, will get a pain-killing injection for a shoulder injury that the team anticipates will sideline him three weeks.
Lance Lynn ends a run of three straight starts against American League teams in the finale against Josh Collmenter. Both have had success against the opposition, Lynn going 2-0 with a 2.61 ERA against Arizona and Collmenter 2-1 with a 0.96 ERA against St. Louis.
Link to box score: St. Louis (30-16) 6, Arizona (21-24) 4