Запросы внешнего ключа в SQLAlchemy

Я новичок в SQLAlchemy после перехода из Django ORM. Я пытаюсь создать простой шаблон вложенного набора, и я хотел бы выполнить родительский поиск. Что я бы сделал так в Django ORM:

Page.objects.get(slug="currentlevel",parent__slug="secondlevel",parent__parent__slug="firstlevel")

Это будет автоматически запрашивать базу данных для каждого родительского элемента, возвращая соответствующую строку страницы.

В SQLAlchemy лучшее, что я могу придумать, это:

session.query(Page).join(Page.parent, aliased=True).filter_by(slug="child")

Итак, я могу запросить непосредственный родительский элемент, но как я могу продолжить цепочку в одном запросе? Динамически, если возможно (произвольное количество уровней)

Пожалуйста, имейте в виду, что я новичок в SQLAlchemy и пришел из относительно защищенного Django ORM. Я уверен, что в документах SQLAchemy есть информация, но я прочитал ее и не могу ее найти.

Спасибо за вашу помощь.


person NeonMonk    schedule 16.03.2014    source источник
comment
Ваше желание сделать все в рамках одного запроса — не что иное, как преждевременная оптимизация :) Выдача 2-3-5 отдельных простых запросов, каждый из которых извлекает один объект по его PK, на самом деле может быть быстрее, чем один монстр-запрос с 2-3-5 уровнями самореферентных соединений, особенно если в таблице много строк. Даже если отдельные запросы немного медленнее — речь идет о микросекундах, что в общей схеме ничтожно мало. Если учесть это, то все становится намного проще :)   -  person Sergey    schedule 18.03.2014
comment
Еще одно предложение: этот вариант использования является хрестоматийным примером, в котором обход URL Pyramid будет блистать. Траверс отличный, попробуй :)   -  person Sergey    schedule 18.03.2014
comment
На самом деле я использую Traversal, но использую его для стека команд соединения. Я займусь профилированием, но в целом стараюсь максимально избегать обращений к базе данных. Хороший шанс, что я думаю об этом неправильно,   -  person NeonMonk    schedule 19.03.2014
comment
на моей машине извлечение одной строки из таблицы по ее ПК занимает 0,5 мс. Извлечение одной строки из запроса с простейшим самореферентным соединением (SELECT * FROM mytable a JOIN mytable b ON a.id=b.id WHERE a.id='boo') занимает 0,9 мс. Извлечение одной строки из запроса с двумя самореферентными соединениями занимает около 1,2 мс. Так что это почти то же самое. Также учтите, что вам, вероятно, в любом случае потребуется получить родительские страницы, хотя бы для отображения их заголовков в хлебных крошках или в меню.   -  person Sergey    schedule 19.03.2014
comment
Хорошее мышление с панировочными сухарями.   -  person NeonMonk    schedule 19.03.2014


Ответы (1)