Many on HN have branded ORMs harmful, suitable only for toy projects where performance doesn't matter and complexity is low. I understand that hand-crafted SELECTs can be more efficient for complex queries, and when things get hairy with an ORM I almost always use its find_by_sql (or similar) functionality.
But a lot of HNers say ORM should be avoided entirely, and I am inclined to believe there's some truth to that. I'm fairly comfortable with SQL and know where to look to learn more, so that side's not a problem for me. But I have a couple of questions:
1) Why shouldn't I use my ORM for the simple CRUD parts of an application, and only reach for raw SQL when doing complex SELECTs?
2) How does one write clean, efficient, maintainable code for dealing with results of SQL queries? Am I supposed to be iterating over row.next to fill an array and identifying columns by numerical array indices like when I first learned to write spaghetti PHP, or what? Should I be using these all through my business logic, or am I supposed to invent my own crude ORM for that?
3) Very smart programmers have asserted that relational data is not object-oriented and we shouldn't try to make it object oriented. But there are so many cases where Django ORM and ActiveRecord idioms just seem perfectly natural, and anything involving the words Cursor and ResultSet don't. I understand that raw SQL can shine in terms of specifying the query, but what is an example of a case where it's cleaner to process database results manually?