Как использовать объединенную загрузку в подзапросе с SQLAlchemy?Python

Программы на Python
Anonymous
Как использовать объединенную загрузку в подзапросе с SQLAlchemy?

Сообщение Anonymous »

У меня определены две модели ORM. с помощью алхимии flask sql. У меня между ними отношения многие-ко-многим.

Код: Выделить всё

artists_artworks_mapping = db.Table(
'artists_artworks_mapping',
db.Column("artwork_id",
db.String(100),
db.ForeignKey('artworks.artwork_id'),
primary_key=True
),
db.Column("artist_id",
db.String(100),
db.ForeignKey('artists.artist_id'),
primary_key=True
)
)
class Artists(db.Model):
artist_id = db.Column(
db.String(100),
primary_key=True,
)
artist_name = db.Column(
db.String(100),
)
artworks_rel = db.relationship(
"Artworks",
secondary = artists_artworks_mapping,
viewonly = True,
back_populates = "artists_rel"
)

class Artworks(db.Model):
artwork_id = db.Column(
db.String(100),
primary_key=True,
)
artwork_name = db.Column(
db.String(100),
)
artists_rel = db.relationship(
"Artists",
secondary = artists_artworks_mapping,
viewonly = True,
back_populates = "artworks_rel"
)
Я пытаюсь запросить свои данные следующим образом:

Код: Выделить всё

columns = ['artist_id', 'artist_name']
join_columns = ['artwork_id']
subq = db.session.query(Artists).options(load_only(*columns))
subq = subq.options(joinedload(getattr(Artists, 'artworks_rel')).load_only(*join_columns))
subq = subq.filter(Artists.artist_id=="my_id")
subq = subq.subquery()
query = db.session.query(Artists.artist_id, func.string_agg(subq.c.artwork_id, ',')).select_from(subq).groupby(Artists.artist_id)
Моя проблема заключается в том, что .subquery() изменяет мой оператор подзапроса, и поэтому мой окончательный запрос не находит нужные столбцы, когда я пытаюсь выбрать_from.
Я использую SQLAlchemy ==2.0.19
Насколько я понял, объединенная загрузка и подзапрос не очень хорошо работают вместе. Подзапрос изменен с

Код: Выделить всё

SELECT artists.artist_id AS artists_artist_id, artworks_1.artwork_id AS artworks_1_artwork_id, artworks_1.artwork_name AS artworks_1_artwork_name
FROM artists LEFT OUTER JOIN (artists_artworks_mapping AS artists_artworks_mapping_1 INNER JOIN artworks AS artworks_1 ON artworks_1.artwork_id = artists_artworks_mapping_1.artwork_id) ON artists.artist_id = artists_artworks_mapping_1.artist_id
WHERE artists.artist_id = %(artist_id_1)s
в

Код: Выделить всё

SELECT {all the columns from artists} FROM artists WHERE artists.artist_id = %(artist_id_1)s) AS anon_1
Я пытался использовать from_statement, но он добавляет перекрестное соединение всякий раз, когда я пытаюсь запросить столбец из него.

Подробнее здесь: https://stackoverflow.com/questions/784 ... sqlalchemy

Вернуться в «Python»