Запрос фильтра SQLAlchemy с несколькими таблицами - PullRequest
0 голосов
/ 06 мая 2018

У меня есть следующие три таблицы.

User:
[
   user_id
   first_name
   last_name
]

Picture:
[
   filename
   picture_type // eg: painting, photograph
   painter
]

Comment
[
   user_id
   filename
   comment
]

Я пытаюсь запросить все имена файлов, которые не были просмотрены текущим пользователем.

следующая строка возвращает все имена файлов, которые были просмотрены и прокомментированы в данном типе изображения

session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.filename == Comment.filename,
                                       Picture.picture_type == 'photograph'
                                                        ).all()

, а в следующей строке возвращаются все имена файлов в указанном типе picture_type

session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.picture_type == 'photograph'
                                                        ).all()

Я ожидал, что следующая строка вернет имена файлов, которые не были просмотрены в указанном типе picture_type, но возвращает пустой список

session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.filename != Comment.filename,
                                       Picture.picture_type == 'photograph'
                                                        ).all()

Я что-то здесь не так делаю? Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Я исследовал Exclusive Join и выяснил проблему.

Это должно было быть Нет == Comment.filename , а не Picture.filename! = Comment.filename .

Я исправил код, как показано ниже, и теперь он работает.

session.query(Picture.filename).outerjoin(Comment).filter(
                                   None == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

Проблема заключалась в том, что полученная таблица левого внешнего соединения не имела бы ни одной строки, удовлетворяющей условию left_field! = Right_field . Результирующие строки будут соответствовать условиям left_field == right_field или None == right_field , поскольку отсутствующее значение в правой таблице будет помечено как null в результирующей таблице .

Ниже ссылка дала мне хорошие знания по этому вопросу.

http://www.datasavantconsulting.com/roland/sql_excl.html

Спасибо всем за попытку помочь.

Тем не менее, я все еще буду открыт для лучших предложений !!!

0 голосов
/ 06 мая 2018

Я думаю, что ваш код имеет синтаксическую ошибку. ты пропустил точку? Вы написали:

session.query(Picture.filename)outerjoin(Comment).filter(
                                   Picture.filename == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

но так и должно быть:

session.query(Picture.filename).outerjoin(Comment).filter(
                                   Picture.filename == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

в других разделах также есть эта проблема

...