One of the most interesting 1.4/2.0 changes is first-class asyncio support, not just for core (the query builder) but for the ORM layer as well: <a href="https://docs.sqlalchemy.org/en/14/changelog/migration_14.html#change-3414" rel="nofollow">https://docs.sqlalchemy.org/en/14/changelog/migration_14.htm...</a><p>As this notes, there's several changes you have to make to your assumptions around the ORM interface. SQLAlchemy, for better or worse, supports "lazy loading" of relationships on attribute access - that is, simply accessing `user.friends` would trigger a query to select a user's friends. This kind of magic is at odds with async/await execution models, where you would instead need to run something like `await user.get_friends()` for non-blocking i/o.<p>It looks like they've done some good work in making the ORM layer work reasonably well with these limitations (<a href="https://docs.sqlalchemy.org/en/14/orm/extensions/asyncio.html#preventing-implicit-io-when-using-asyncsession" rel="nofollow">https://docs.sqlalchemy.org/en/14/orm/extensions/asyncio.htm...</a>), but I wonder if removing "helpful magic" like this will push more people to stick with the query-builder, rather than the ORM.