Start here. This is the direct spoken answer to practice first.
Overview
Chooses a SQLAlchemy abstraction from the work's shape instead of performance slogans.
I use the ORM when the operation naturally works with mapped entities, relationships, identity, and a unit of work. I use SQLAlchemy Core when I want composable SQL expressions and explicit row shapes without ORM object state, often for reporting or bulk-oriented paths. Raw SQL is reasonable when a database-specific feature or carefully tuned query is clearer than forcing it through another abstraction. All three still need parameters, transactions, and reviewable SQL.