Присоединяйтесь к таблице на себя, чтобы найти пользователя с такими же отношениями - PullRequest
0 голосов
/ 14 января 2019

РЕДАКТИРОВАТЬ: Последний шанс для меня, короткий вопрос

Я бы хотел выполнить этот запрос с помощью sqlalchemy:

SELECT          first.* , 
                second.* , 
                third.* , 
                fourth.* , 
                mytable.* , 
                mytablesamerelationexist.* 
FROM            third 
LEFT OUTER JOIN mytable 
ON              third.id = mytable.id_third 
LEFT OUTER JOIN first 
ON              first.id = mytable.id_first 
LEFT OUTER JOIN second 
ON              second.id = mytable.id_second 
LEFT OUTER JOIN fourth 
ON              fourth.id = mytable.id_fourth 
LEFT OUTER JOIN mytable AS mytablesamerelationexist 
ON              mytable.id_second = mytablesamerelationexist.id_second 
AND             ( 
                                mytable.id_first = mytablesamerelationexist.id_first 
                OR              ( 
                                                mytable.id_first IS NULL 
                                AND             mytablesamerelationexist.id_first IS NULL ) 
                AND             mytable.id_third = {MYUSERPARAM} )

Я хотел бы использовать contains_eager для доступа к объекту что-то вроде:

third.Mytable.MyTableSameRelationExist

Остальная часть запроса уже работает, мне просто нужно выполнить самостоятельное соединение.

mytable.id_first может быть NULL

Существует минимум моего определения модели model definition

Длинный вопрос:

Как лучше всего присоединиться к столу на себя. Моя таблица содержит 4 внешних ключа, и мне нужно использовать два из них, чтобы найти одинаковые отношения. Один из этих внешних ключей может быть нулевым. Мне нужно получить отношение NULL == NULL. Я не хочу определять внешний ключ для себя в таблице.

Я пытаюсь определить свой запрос следующим образом:

tablealias = aliased(MyTable)
...
outerjoin(tablealias , and_(or_(MyTable.id_first == tablealias.first,
                                and_(MyTable.id_first.is_(None),
                                     tablealias.id_first.is_(None))),
                                MyTable.id_second == tablealias.id_second,
                            tablealias.id_third == MYUSERID)).

Я бы хотел получить иерархический доступ к результату отношений, например, MyTable.self_child.

Итак, я добавляю в свой запрос:

options(contains_eager(MyTable.self_parent, MyTable.self_child))

Я много чего пробовал в своем классе MyTable , чтобы заставить связь self_child работать без добавления внешнего ключа.

Пока я определил id_second как внешний ключ, потому что id_first может быть нулевым, и я думаю, что это может быть проблемой (Я прав?):

self_parent = relationship("MyTable",  primaryjoin='foreign(mytable.id_second) == remote(foreign(mytable.id_second))')
self_child = relationship("MyTable", primaryjoin='foreign(mytable.id_second) == remote(mytable.id_second)')

С этим определением, когда я инициализирую свою базу данных, я получил ошибку:

Объект 'Table' не имеет атрибута 'id_second'

Нужно ли мне добавлять отношения в мой класс, если внешний ключ не получен сам по себе? Если нет необходимости, как я могу получить доступ к определению отношения с contains_eager? Как это правильно определить?

EDIT: Я передаю ошибку ниже, но я получил много разных ошибок, что-то вроде

неоднозначное имя столбца

или

это одно и то же лицо

Для последней ошибки я определяю свой код в Class как:

self_child = relationship("MyTable", primaryjoin=and_(or_(foreign(id_first) == id_first, and_(foreign(id_first).is_(None), id_first.is_(None))).self_group(), foreign(id_second) == id_second).self_group(), remote_side=[id_second, id_first], lazy='joined')

Запрос:

tablealias = aliased(MyTable)
...
outerjoin(crotalias.self_child)
...
options(contains_eager(FirstLevel.mytable, crotalias.self_child))

Если я использую backref="self_parent"

Я получил сообщение:

MyTable.self_child и обратная ссылка MyTable.self_parent являются символ того же направления («ОНЕТОМАНИЯ»). Вы хотели установить remote_side на стороне многие-к-одному?

Edit: Существует минимум моего определения модели model definition

Любая подсказка будет оценена.

1 Ответ

0 голосов
/ 23 января 2019

Я удивлен, но я не получил подсказки по этому вопросу.

Пока я использовал вторую идею, я добавляю список id_first и id_second в сеансе пользователя. Итак, я могу циклически просмотреть результат моего запроса, чтобы он соответствовал значению моего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...