Денис и Килотан дали вам хорошие ответы. Я просто сосредоточусь на пункте 2.
Иногда зависит от вашего вкуса. Есть моменты, когда вам нужны специфичные для базы данных функции, которые ORM не может сделать, это тот случай, когда вы должны использовать Session(<sql here>).execute()
или conn.execute(<sql here>)
. Другой случай, когда у вас очень сложный запрос, который вам не подходит, и вы не можете найти подходящее выражение ORM.
Обычно достаточно использования функций ORM, таких как select([...]).where(...
или Session.query(<Model here>).filter(...
(декларативная база). Почти каждый SQL-запрос имеет эквивалент ORM.