Как преобразовать результирующие строки SQLAlchemy во вложенные символы

Я оцениваю потенциальные настройки для использования SQLAlchemy в приложении FastAPI async / await. В настоящее время я сочиняю модели и запросы, используя declarative_base классы, а затем выполнение запросов с базами данных (синтаксис гораздо более читабелен и его легко написать для классов моделей; работа напрямую с базовыми таблицами SQLAlchemy - не мое любимое занятие). Это все прекрасно работает.

На данный момент у меня есть строки результатов SQLAlchemy, но мне нужно преобразовать их в общие типы, потенциально вложенные из-за загруженных отношений (только тип, который я буду поддерживать в этой среде). Я не могу использовать ORM SQLAlchemy, потому что 1) у меня нет engine или же session; и 2) ORM предполагает, что он может просто поразить базу данных всякий раз, когда ему нужно загрузить объекты, что не имеет место в приложении FastAPI для асинхронного / ожидающего выполнения.

У кого-нибудь есть идеи или указания, как этого добиться? Я изо всех сил пытаюсь выяснить, как связать строки результатов с определенными ключами отношения, в частности. Я копался во внутренностях SQLAlchemy для идей, но это довольно непрозрачно, поскольку во многих из них предполагается целый уровень кэширования объектов и управления сессиями / движком, которого просто нет в моей настройке.

Две вещи, которые я мог бы использовать идеи о:

  1. Как сопоставить названия столбцов, как table_1_column_name к конкретным моделям и их свойствам
  2. Как обнаружить и отобразить отношения (потенциально более одного уровня в глубину)

Спасибо за любую помощь, вы можете предоставить!

Обновление: Вы можете найти работающий пример здесь: 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.

Другие вопросы по тегам