Как преобразовать результирующие строки SQLAlchemy во вложенные символы
Я оцениваю потенциальные настройки для использования SQLAlchemy в приложении FastAPI async / await. В настоящее время я сочиняю модели и запросы, используя declarative_base
классы, а затем выполнение запросов с базами данных (синтаксис гораздо более читабелен и его легко написать для классов моделей; работа напрямую с базовыми таблицами SQLAlchemy - не мое любимое занятие). Это все прекрасно работает.
На данный момент у меня есть строки результатов SQLAlchemy, но мне нужно преобразовать их в общие типы, потенциально вложенные из-за загруженных отношений (только тип, который я буду поддерживать в этой среде). Я не могу использовать ORM SQLAlchemy, потому что 1) у меня нет engine
или же session
; и 2) ORM предполагает, что он может просто поразить базу данных всякий раз, когда ему нужно загрузить объекты, что не имеет место в приложении FastAPI для асинхронного / ожидающего выполнения.
У кого-нибудь есть идеи или указания, как этого добиться? Я изо всех сил пытаюсь выяснить, как связать строки результатов с определенными ключами отношения, в частности. Я копался во внутренностях SQLAlchemy для идей, но это довольно непрозрачно, поскольку во многих из них предполагается целый уровень кэширования объектов и управления сессиями / движком, которого просто нет в моей настройке.
Две вещи, которые я мог бы использовать идеи о:
- Как сопоставить названия столбцов, как
table_1_column_name
к конкретным моделям и их свойствам - Как обнаружить и отобразить отношения (потенциально более одного уровня в глубину)
Спасибо за любую помощь, вы можете предоставить!
Обновление: Вы можете найти работающий пример здесь: https://gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b (смотрите строки 92-109 для соответствующего места, где мне нужно выяснить, как преобразовать RowProxy во вложенный dict путем сопоставления имена столбцов запросов к именам в модели SQLAlchemy).
1 ответ
Если вы сначала db, то метод sqlalchemy execute обычно возвращает объект Result Proxy, и вы можете получить его результат с помощью таких методов, как fetchone, first, fetchall, а затем привести его к списку или dict. Вы также можете увидеть этот док
Объект SQLALchemy имеет возможность возвращаться как dict - вот исходный документ SQLALchemy, который вам поможет. https://docs.sqlalchemy.org/en/13/orm/query.html
Или вы можете использовать https://pythonhosted.org/dictalchemy, который работает как оболочка поверх SQLALchemy.
Надеюсь, это поможет.
Преобразование объекта в dict должно работать, если результатом является необработанная строка SQLAlchemy, а не экземпляр с отображением ORM.
Судя по вашему комментарию к другому ответу, похоже, что вам нужно отобразить результат обратно в экземпляр ORM. Вы можете определить декларативные сопоставления, чтобы ваш результат переводился обратно в экземпляр Python.