session.execute никогда не возвращал dict, он возвращает объект RowProxy, который может быть проиндексирован как dict, использующий либо целочисленные ключи для позиционного поиска, строковые ключи для поиска на основе меток, либо объекты Column для ищите значение этого столбца. Проблема здесь в том, что session.execute(query)
не делает то, что вы ожидаете. Он преобразует объект Query в оператор Select, выполняет его и возвращает результат напрямую. Набор результатов ничего не знает об особенностях уровня ORM. Что изменилось между 0,5 и 0,6, так это то, что ORM использует другой алгоритм для пометки столбцов в запросах, теперь он добавляет имя таблицы к метке. Поэтому, когда раньше row['id']
работало, теперь row['users_id']
работает. В обоих случаях row[User.__table__.columns['id']]
работает.
Для выполнения запросов ORM вы должны использовать методы .all()
, .first()
и .one()
, либо выполнять итерации по ним, либо использовать числовое индексирование. Запрос возвращает именованные объекты кортежа. Если вам нужен дикт, застегните кортеж с ключами:
row = session.query(User.id, User.username, User.email)\
.filter(and_(User.id == id, User.username == username)).first()
print("id=%s username=%s email=%s" % row) # positional
print(row.id, row.username) # by label
print(dict(zip(row.keys(), row))) # as a dict