Я проснулся в существующем API Python для базы данных веб-приложения и хотел бы предоставить пользователям возможности форматирования результатов своих запросов.В некоторых случаях подходит JSON, а в других CSV.API построен на декларативном ORM SQLAlchemy, и запросы в системе обычно возвращают экземпляры ORM или списки экземпляров вместе с их связями.Преобразовать это в JSON очень просто, однако у меня возникают проблемы с извлечением табличного представления для преобразования результатов в CSV.Используя основные операции SQLAlchemy или простой SQL, легко вернуть объединенное табличное представление.Я знаю, что за кулисами SQLAlchemy создает необходимые операторы SQL и объединяет их для выполнения того, что я запрашиваю, но оно скрыто за маппером.
Учитывая, что API, с которым я работаю, уже настроен для запроса всегодекларативно, используя классы ORM, как я могу получить обратно строки, которые были возвращены базой данных до того, как SQLAlchemy выполнит свою магию, чтобы отобразить все обратно объектам?
user_addresses = Table("user_addresses", Base.metadata,
Column("user_id", Integer, ForeignKey("user.id")),
Column("address_id", Integer, ForeignKey("address.id"))
)
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
addresses = relationship("Address", secondary=user_addresses, back_populates="users")
class Address(Base):
__tablename__ = "address"
id = Column(Integer, primary_key=True, autoincrement=True)
number = Column(Integer)
street = Column(String)
city = Column(String)
state = Column(String)
zip = Column(Integer)
users = relationship("User", secondary=user_addresses, back_populates="addresses")
## configure session, engine, etc.
# get all relationships loaded together
statement = session.query(User).options(joinedload("*"))
# normal orm classes
results = statement.all()
# I want something like
flat_results = statement.table()
Я думаю, что что-то подобное должно было бы взаимодействоватьнепосредственно с предварительно сопоставленными таблицами, но я не уверен, как вернуться к таблицам, не переписывая API запросов для серверной части.