Найти тему
Computer Pro

SQLAlchemy: Расширенные настройки RELATIONSHIP, индексы и constraints #8

Всё началось с:

Продолжаем...

Когда мы запускаем весь наш код (см. статью с индексом #7) мы получаем очень много различных предупреждений, что-то типа этого:

-2

И чем больше у нас будет моделей, тем больше будет подобных предупреждений, а это не есть гуд!

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

-3

Снова запускаем наш скрипт, в котором, после создания таблицы resumes, появлялось предупреждение, теперь его там нет:

-4

Поле back_populates явно указывает SQLAlchemy о том что эти две таблицы связаны. Есть еще настройка backref="worker", она создает параметр "worker" если он создан не был, но это уже устаревшая настройка. И лучше им не пользоваться.

Далее...

Мы можем ввести дополнительное поле, в котором будут находиться резюме удовлетворяющие каким либо условиям. Например, только те резюме где указан уровень рабочей нагрузки как part_time. Пропишем такое поле:

это оформляется через параметр primaryjoin, где параметры указываются через функцию end_ и вот так в кавычках и записываются
это оформляется через параметр primaryjoin, где параметры указываются через функцию end_ и вот так в кавычках и записываются

Напишем простенький запрос, который нам вызовет этот resumes_part_time:

-6

После выполнения можно видеть вот такой результат:

-7
-8

Как можно видеть, теперь мы получили список всех работников, но теперь в каждом объекте работника есть поле resumes_part_time и там будут только те резюме которые удовлетворяют условиям, либо пустой список.

Но можно сделать вывод и другого толка - показать только тех работников, у которых резюме удовлетворяет условиям - part_time например. Это реализуется уже другой функции - contains_eager():

сразу пройдемся циклом по полученным результатам и выведем username работника и все его резюме
сразу пройдемся циклом по полученным результатам и выведем username работника и все его резюме

Результатом работы подобной конструкции будет список объектов работников, у которых резюме содержит рабочую нагрузку - part_time:

-10

Далее, еще может потребоваться не все резюме (у работника их может быть очень много) а скажем по одному, тогда будем использовать для этого тот же contains_eager с опцией limit. Создадим более сложный запрос (с подзапросом):

-11

Если установить лимит = 2 то ответ будет таким:

-12

А при limit(1):

-13

Индексы и ограничения (index & constraints)

Эти параметры можно задать при помощи __table_args__

-14

Не всё получилось идеально правильно, но все задачи данной темы выполнены. Надеюсь что-то отложилось в моей голове... Когда же я закончу эту "Алхимию"?! Вроде бы немного осталось...

Продолжение следует...