Преобразовать результат запроса (список кортежей вместо ResultProxy) сгенерированного запроса SQLAlchemy в список объектов - PullRequest
0 голосов
/ 20 сентября 2019

Вот что у меня есть:

  1. Использование SQLAlchemy ORM для построения инструкции SELECT
  2. Выполнение инструкции SELECT с использованием другой библиотеки, возвращаемое значение которой не похоже на ResultProxy.Я использую для выполнения AWS Serverless Aurora команду execute_statement из boto3 rds-data, а именно:

Вот чего я пытаюсь достичь:

Создание списка объектов из результатов # 2

Я надеюсь, что есть способ построить объекты путем своего рода обратного инжиниринга результатов с использованием объекта Query из # 1.


Пример кода:

from entity.base import Base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import Query, relationship, load_only, joinedload


class Tree(Base):
    __tablename__ = 'tree'
    id = Column(Integer, primary_key=True, autoincrement=True)
    roots = Column(String(32))
    trunk_id = Column(Integer, ForeignKey("trunk.id"))
    trunk = relationship("Trunk")


class Trunk(Base):
    __tablename__ = 'trunk'
    id = Column(Integer, primary_key=True, autoincrement=True)
    rings = Column(String(32))
    apple_id = Column(Integer, ForeignKey("fruit.id"))
    orange_id = Column(Integer, ForeignKey("fruit.id"))
    apple = relationship("Fruit", foreign_keys=[apple_id])
    orange = relationship("Fruit", foreign_keys=[orange_id])


class Fruit(Base):
    __tablename__ = 'fruit'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32))


query = Query(Tree)\
    .options(load_only("roots"))\
    .options(joinedload(Tree.trunk).load_only("rings")
             .options(joinedload(Trunk.apple).load_only("name"),
                      joinedload(Trunk.orange).load_only("name")))

# Statement Output:
# SELECT 
#   tree.id AS tree_id, 
#   tree.roots AS tree_roots, 
#   tree.trunk_id AS tree_trunk_id, 
#   fruit_1.id AS fruit_1_id, 
#   fruit_1.name AS fruit_1_name, 
#   fruit_2.id AS fruit_2_id, 
#   fruit_2.name AS fruit_2_name, 
#   trunk_1.id AS trunk_1_id, 
#   trunk_1.rings AS trunk_1_rings 
# FROM tree 
# LEFT OUTER JOIN trunk AS trunk_1 ON trunk_1.id = tree.trunk_id 
# LEFT OUTER JOIN fruit AS fruit_1 ON fruit_1.id = trunk_1.apple_id 
# LEFT OUTER JOIN fruit AS fruit_2 ON fruit_2.id = trunk_1.orange_id

result = [(1, "myroots", 1, 1, "myapple", 2, "myorange", 1, "myrings")]

# How to get list of Tree here?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...