РЕДАКТИРОВАТЬ: Последний шанс для меня, короткий вопрос
Я бы хотел выполнить этот запрос с помощью 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
Существует минимум моего определения модели
Длинный вопрос:
Как лучше всего присоединиться к столу на себя. Моя таблица содержит 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:
Существует минимум моего определения модели
Любая подсказка будет оценена.