0: Артём, из будущего снова с вами мы продолжаем, и у нас последняя заключительная часть. Мы хотим добавить букинг, только если есть свободные комнаты и у нас прям много, много запросов на это дело, но тем не менее, это очень важно делать, потому что мы не хотим, чтобы у нас там половина
1: Клиентов, забронировал номер, а потом нам придётся звонить, извиняться. Простите, а номера то закончились. Поэтому, что мы делаем? В прошлом уроке? Мы получили скалярное значение. Собственно, румс лефт равно румс, лефт, скаляр. Давайте
2: Здесь, наверное, что-нибудь изменим. Вот здесь напишем Гетт румз лефт, изменим название запроса, что это запрос какой-то, да, на получение get и количество комнаток вот мы их получили, это у нас, integer можно так написать для понимания и сразу.
3: If румс лефт больше чем 0, тогда мы можем забронировать комнату и да, вот иначе, например, мы вернём нон.
4: А если не none, тогда что мы хотим сделать? В 1 очередь? Самые внимательные из вас могли заметить, что мы не получили цену от клиента. По какой цене он бронирует отель, и мы не хотим, чтобы клиенты могли переда
5: Сами цену. Ну вдруг они передадут 1 ₽ или - 1 ₽, и мы ещё им должны останемся. Поэтому давайте здесь получим цену, напишем запрос на получение цены. Мы просто хотим получить из румс прайс, причём по
6: Конкретной комнате да, filter by
7: И у нас здесь должно быть id равно рум айди, то есть filter by filter уэр они примерно одинаково могут использоваться зачем они все есть я наверное не смогу вам ответить итак, Гетт прайс мы хотим, собственно получить саму.
8: Цену давайте напишем прайс, равно await session, execute и собственно вот этот get price и также, что нам необходимо сделать собрать скаляр прайс, интеджер равно прайс.
9: Точка скаляр, да, то есть это единственное значение. Просто 1 столбец, 1 строчка. Мы получаем этот скалярник это цена отеля за 1 день проживания. Далее делаем запрос на инсерт на добавление Букинга. Это у нас инсерт.
10: Мы вставляем в букингс, причём вставляем мы, что мы вставляем значение и передаём здесь просто значение как в обычную функцию у нас в букингах, что есть. Давайте вот здесь прям это дело скопируем вот эти столбцы, мы должны
11: Задать самостоятельно опять же не смотрите что здесь есть, а вот total cost и total days у нас автоматически рассчитываются так как это компьютер свойства generates эс вот эта формула, поэтому нам их трогать не нужно, давайте все это дело сюда вставим.
12: Вот так это я все скопировал для удобства. Здесь равно запятушку проставим. Рум айди у нас какая? Да, рум айди. У нас так и называется параметр. User id у нас юзер точка айди. А, или, простите, нет, у нас здесь называется он. User id. Да, да, да, да, да, его.
13: Сюда мы и передаём дейт Фром. Мы передаём дейт Фром. Ничего сложного. Дей ту дей ту и прайс вот эту ценушланг йста. Мы не хотим, чтобы цену задавал сам клиент. Мы сами её получим. Такие вот мы
14: Ребята, достаточно исполнить запрос. Что мы делаем? Кстати, что ещё можно сделать? Помимо обычной вставки? Когда у нас нам ничего не возвращает постгресс? Можно вернуть эту самую строку и отдать её дальше.
15: С ней как-то работать там, на фронтенде или, не знаю, просто чтобы лишний раз потом не обращаться к базе, забирать вот этот новый букинг. Давайте returning пропишем. То есть возвращая, верни, пожалуйста, полностью строку букингс можно было бы вернуть, например, там букингс айди нам бы вернулся только
16: Айдишник можно было бы вернуть, не знаю. User id ну что, что душе угодно, мы вернём полностью модель букингс и давайте здесь за экзекьютив это дело сешн экзекьют.
17: Букингс, точнее, эт букинг, да, и что мы получим? Мы получим новый букинг. Можно так и написать, например, новый букинг, и мы вернём нью букинг скаляр. Я ещё
18: Чуть позже в курсе, объясню, почему здесь используется скаляр, но смотрите, если мы возвращаем целостную модель букингс, например, без использования каких-то других столбцов, других таблиц или без укорачивания этой модели,
19: Или, например, мы могли бы передать просто букинг. Зайди букингс, например, что там user id 2 столбца. Это бы уже не соответствовало модели букингс, так как мы передаём целиком модель, мы можем использовать скаляр. Нам вернётся вся модель, когда мы работаем с
20: 1 числом скаляр также отдаёт нам всего 1 число когда мы, как я сказал, берём несколько столбцов, которые не отображают 1 какую-то конкретную модель, нам нужно использовать one или first, или там.
21: One or none или что-то подобное, или если у нас много запросов, мы используем ол, а когда у нас возвращаются только модели какие-то уже фиксированные, которые у нас заданы, типа букинг хотелс или что-то подобное, мы можем воспользоваться скаляр.
22: All i гораздо приятнее будут результаты от алхимии, они будут лучше разбираться по адентика итак, мы вернём здесь скаляр вот это значение букинг нам вернутся все столбцы, опять же иначе вернётся none.
23: И давайте, что мы сделаем? Что мы ещё забыли? Мы забыли сделать коммит, иначе у нас данные не добавятся. Коммит. После этого данные реально занесутся. В базу данных появится новый букинг вернётся нам.
24: И давайте вот здесь проверим это дело. Давайте скажем, что букинг равно вот эта тема и так так так, if not букинг, то есть если нам вернётся none, давайте зарейзит и на самом деле я из
25: Будущего. Я уже эту ошибочку сделал, и она называется у нас каким образом? Рум кенна би букт? Комната не может быть забукано, забронирована. Статус код я выбрал 409. Возможно, здесь другой код нужен.
26: Я в интернетах не нашёл, но я подумал, что конфликтная ситуация ну подходит под определение и detail не осталось свободных номеров, чтобы на фронтенде можно было отобразить собственно этот детейл и здесь мы рейзим эту ошибку и давайте давай.
27: Давайте проверим. Давайте забукан ещё несколько раз. Вот эту комнатку. Давайте попробуем. Экзекьют. Так, небольшая ошибочка. Смотрим по быстренькому, что не так? Локал вериал её.
28: Before саймен. Так что же это значит?
29: Да, действительно, мы вот здесь не передали вот так вот все это дело должно теперь работать, да, название мы изменили. Запроса экзекьют. Ага. 1 пошёл. Ещё забронировали, ещё смогли, ещё раз смогли.
30: Сейчас должно быть 0 комнат вуаля, 409 ошибка. Не осталось свободных номеров. Помните, у нас было 5 свободных номеров? 2 уже было забронировано. Изначально у нас оставалось 3. Я сейчас 3 раза нажал экзекьют, соответственно, добавилось 3 записи в базе данных мы не будем проверять. И вышла.
31: Ошибка, не осталось свободных номеров, так как у нас не выполняется условие, что количество комнат больше нуля, потому что оно равно нулю. Да, можно было бы условие сделать там равно равно нулю, но на всякий случай мы сделали больше нуля и вуаля все классно работает.
32: Вопрос здесь выводится, конечно, это можно дело закомментировать, чтобы каждый раз он не выводился, не высчитывался. И вот таким образом мы написали наш запрос. Я вам очень рекомендую самостоятельно написать его самостоятельно посмотреть, разобраться, что делает каждая часть.
33: Действительно, запрос сложный, мы очень много различных концепций и языка sql и sq химии посмотрели и на то, как мы можем создавать вот эти отдельные запросики, отдельные таблички через with да, здесь это называется сэто её, как мы можем с ними?
34: Работать, как мы работаем с селектом, с инсертом, с условиями, с множественными условиями, с and or, с вложенными условиями и так далее. Как работает фильтрация, группировка и так далее. На самом деле, довольно, ну, знакомые названия, если вы пришли
35: Языка скил вер групп бай все это примерно похоже там join кстати, друзья, я хочу попросить прощения здесь я забыл написать из outer равно true, потому что иначе у нас джоин будет не left, а.
36: Я это дело даже просмотрел да, здесь, здесь джоин был не left, у нас отобразится left outer join. Если мы напишем из outer тру, обязательно, надеюсь вы досмотрели до этого момента, пропишите это дело и на этом наверное все, Артём, из будущего всем.
37: Удачного прохождения.