This is also tapping into one of the many optimizations you have to know about when using ORMs. Can you "select" 10M rows from a table? Is an object instantiated for each one? If they're lazily created, when are they destroyed, and where is the buffer of rows held, client side or server side? How do you efficiently update each one without incurring a sql statement for each update?
All of these questions require deep knowledge of the inner workings of the ORM, when in SQL, this is a lot more straightforward.
Not really. It isn't a SQL issue; it's a database driver problem.
The Django ORM takes take a whole of an hour to read, and after that you have 90% of the use cases covered. Considering that I've been using that framework for many years now, the overhead of that knowledge is irrelevant.
All of these questions require deep knowledge of the inner workings of the ORM, when in SQL, this is a lot more straightforward.