Python, SqlAlchemy: отношения многие ко многим, найти тех, у кого нет - PullRequest
2 голосов
/ 07 октября 2011

Скажем, у меня есть два типа объектов, Movies и Tags, связанные ORM в соотношении многие ко многим с таблицей ассоциации, обозначенной secondary аргумент relationship(), и я хочу найти, скажем, все Movies без Tags?Какой запрос я бы запустил для достижения этого эффекта?

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Используйте any () , что особенно полезно для запросов такого типа.

query = session.query(Movies).filter(~Movies.tags.any())

Здесь tags - это имя отношения «многие ко многим» для Tags.

2 голосов
/ 07 октября 2011

Если бы TagId был частью объекта Movies, это был бы простой случай проверки того, был ли TagId для фильмов нулевым:

session.query(Movies).filter(Movies.TagId == None).all()   

Но ваш комментарий «многие ко многим» предлагает ссылку MoviesTagsсущность, так что это сложнее и включает в себя ссылки на MoviesTags с помощью левого внешнего соединения.

Есть хорошее руководство по написанию и отладке похожих SQL-запросов.И вы в основном хотите в итоге:

select Movies.name from Movies 
left outer join MoviesTags on Movies.MovieId = MoviesTags.MovieId 
where MoviesTags.TagId is null
...