Вот что у меня есть:
- Использование SQLAlchemy ORM для построения инструкции SELECT
- Выполнение инструкции 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?