Step 3 (S-44793)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14829/step/3

Step 3 (S-44793) 1.png

[00:00 - 00:15] а теперь давайте посмотрим как можно работать с базами данных из копать а интерфейс для работы с базами данных а представляет собой специальный язык


[00:15 - 00:30] а ну можно сказать что ты за программирование на он несколько не полноценно это язык описания а и запросов к данным sx structured query language язык структурированных запросов а соответственно


[00:30 - 00:45] протокол работа база он у всех всех баз данных разные но в целом он сводится к тому что вы отправляете в базу данных а запрос виде


[00:45 - 01:03] простой строки текста а получаете оттуда а результат в виде таблицы с данными а каким образом работа с базами данных реляционными осуществляется языке python а поэтому есть а стандарт


Step 3 (S-44793) 2.png

[01:03 - 01:22] ну локальной для ли закопай а 2 49 а в нем описано а в точности как должен быть выглядеть любая библиотека для работы с базами данных


[01:22 - 01:39] а в частности мы будем использовать базу данных в москве и соответственно библиотеку mysql тебе для работы с базами данных а соответственно начало для начала


[01:39 - 01:54] мы эту библиотеку она должна быть установлена на компьютер мы импортировали мы вызываем функцию коннект а функцию коннект передаются


[01:54 - 02:11] параметра указывающая хост то есть машина ip адрес либо доменное имя компьютера где запущен на базу данных а можно указывать порт если указывать будет использоваться стандартные для mysql


[02:11 - 02:25] а имя пользователя и пароль это имя пользователя и пароль а внутри самой базы данных то есть все базы данных поскольку представляет доступ к данным а они требуют авторизации


[02:25 - 02:42] здесь вводится логин пароль и указывается а до б а заяц вообще эта схема а зачем нужна схема дело в том что


[02:42 - 02:58] на 1 сервере базы данных может быть развернута а несколько схем для разных приложений поэтому подключайтесь непосредственно к физическому серверу базы вы должны указать с таким конкретным экземпляром


[02:58 - 03:13] вы работаете то есть а там может быть база для вашего сайта базу для другого какого то сайта вы должны выбрать соответственно логин и пароль всегда даются в привязки к конкретной базе


[03:13 - 03:31] то есть вы должны ввести логин и пароль для доступа конкретность конкретной схеме данной базы данных итак а когда когда произошло подключение вы получаете объект connection


[03:31 - 03:48] вот если бы у нас обычно называют connection а языке python с помощью этого объекта можно сделать довольно немного то шлет у него вообще говоря мало лет а 1 метод это курсор


[03:48 - 04:06] возвращает объект курсор а метод коммит соответствующему back в некоторых языках есть а


[04:06 - 04:25] управление транзакциями то есть этот коммит в частности позволяет вам завершить текущую транзакцию то есть сохранить все те изменения которые вы делали в базе и сделать их постоянными записать так скажем в постоянное хранилище метод close закрывает текущий соединения


[04:25 - 04:43] а в некоторых базах данных есть такие есть такое понятие как курсор а курсор то специально для получения большого количества да то с помощью курсор можно получать данные последовательно ходить по ним а


[04:43 - 05:01] вперед назад произошла выборка вас появились какие то данные напасть а на сервере базы вы можете с помощью курсор по ним передвигаться в москве или курсор не поддерживается поэтому курсор фактически э э


[05:01 - 05:19] не выполняя свой функционал это просто некоторые объект для осуществления запросов к базе данных а на практике все все все все вопросы сводятся к вызову методов объекта курсор а какие например есть метод например есть


Step 3 (S-44793) 3.png

[05:19 - 05:35] метод где cute это основной метод курсор а передается строка и дополнительный набор параметров


[05:35 - 05:51] а в строке должен содержаться sql запрос вот здесь мы видим а тройные кавычки в языке python на то тоже строка просто поддерживать перед переводы строк


[05:51 - 06:07] удобно для форматирования многострочных всяких конструкций а мы видим что здесь обновляется таблице пользователей то есть обновить таблицу пользователей установить а год


[06:07 - 06:23] на 1 больше а для тех пользователей у которых имя равняется вот такая конструкция а вот вместо процент с будет подставлено вот эта переменная


[06:23 - 06:38] зачем так делать мы поговорим дальше а в принципе можно делать а запросы без подставном без таких постановок например если вам нужно выбрать тех пользователей вы можете сделать просто запрос


[06:38 - 06:55] звездочка from таблицы а если произошла какая то ошибка выбросил exception списке ц а необходимых описаны


[06:55 - 07:14] в стандарте по которой мы говорили то есть если вы хотите как то обработать ситуацию с базой данных а вы можете перехватить от акцепта что то сделать а хорошо мы выполнили запрос не произошло значит база а что ты выполнила


[07:14 - 07:34] теперь мы хотим получить данные для этого используется а метода например чехол получает все строки сразу а этот метод стоит использовать когда вы знаете что в результате запроса будет не очень большое количество строк


[07:34 - 07:50] потому что все строки загружается в память языка python если их слишком много может произойти переполнение а если строк мало можно делать а ведь вам загружает а 1 строчку


[07:50 - 08:05] ну и естественно что из базы данных читается не по 1 строке а читаются а большим куском язык python возвращается именно 1 строка


[08:05 - 08:22] а я специально метод execute меня которая позволяет вставлять а а использовать хранимые процедуры храним в зале из пульта prepared statement


[08:22 - 08:37] некоторые базы позволяют а 1 раз а разобрать запрос и потом ее выполнять с несколькими параметрами повторно примеру мы хотим вставить данные в таблицу пользователей


[08:37 - 08:54] это делается с помощью оператора языке указывается таблице какие поля и какие значения а в принципе можно в цикле вызывать а эту конструкцию с помощью команды забьют


[08:54 - 09:12] а проблема в том что на каждый раз на такое обращение сервер баз данных он заново анализирует запрос заново проверяет права доступа на это тратится время быстрее использовать prepared statements


[09:12 - 09:28] так в конструкциях в этом случае запрос если баз данных это поддерживает а будет разобрана 1 раз а потом выполнится несколько раз с указанными здесь так после того как а запрос выполнился


[09:28 - 09:44] делается операцией коммит и а соединение закрывается а теперь про place holders


[09:44 - 10:02] а зачем нужно использовать вот такого рода конструкций а вариант номер 1 мы можем вообще просто метод идиоту курсор передавать за просто собирать запрос в 1 строку и передавать его целиком как ты сделал нас в 1 примере


[10:02 - 10:18] а этот подход не очень хорош потому что он не оставляет возможность для так называемых из кельвин я мы должны точно знать что у нас находится вот в этой переменной что там находится именно а строка


[10:18 - 10:34] и это строка правильного формата то есть это e mail если мы не можем этого гарантировать например если ему отправляется к нам через форму по протоколу http пользователь может ввести в принципе любую строчку


[10:34 - 10:48] если мы не делаем валидацию то например пользователь может вести вот такую конструкцию если мы поставим эту конструкцию на место переменной remember то мы получим что


[10:48 - 11:05] а у нас совершенно неправильный запрос получается а ну вот например здесь да у нас получится запрос а выбрать все из таблицы пользователей емейл равняется пустой строке


[11:05 - 11:23] вот кавычкой от кавычках либо 1 равняется 1 1 равняется 1 это условие истинно всегда поэтому фактически данный запрос выберет всех пользователей а выбрать все пользователи это плохая идея потому что если мы выводим их на страницу


[11:23 - 11:41] а пользователь может вдруг увидеть не те данные которые предназначались и даже если мы не выводим и пользователь не увидит что у нас хранится в базе а этот запрос очень сильно грузит базу данных потому что придется поднять всех пользователей


[11:41 - 11:58] из таблицы загрузить а вместо этого вместо того чтобы склеивать запрос а и строки а база данных точнее не баз данных о библиотеке для доступа к базам данным


[11:58 - 12:14] а представляет а функционал плейс холдеры а вот теперь запросе встречается специальной конструкции вместе со своим запросам продается данном случае 1 а можно передавать табл


[12:14 - 12:30] так вот если если нужно несколько тут несколько вариантов для передается несколько параметров которой поставляется на соответствующие места при установке происходит а квотирование либо эскейпинг


[12:30 - 12:48] опасные символы а в данном случае опасным символом был а одинарная кавычка а все опасные символ они заменяются на безопасное то есть если у вас одинарная кавычка будет она будет не надо бы услышать знак кавычках


[12:48 - 13:05] это гарантирует что здесь строчка не разорвется и у вас будет корректней сказать запрос который делает то что у него ожидалось а использование placeholders является очень хорошей практикой а их не использовали а


[13:05 - 13:20] ведет к потенциальным ошибкам а безопасности и уязвимостей а надо отметить что несмотря на эту хорошую практику не всегда есть возможность использовать плейс холдеры поисковая


[13:20 - 13:38] можно использовать в тех местах где предполагается значение то есть там где вы хотите указать значение а в некоторых случаях вам нужно собрать запрос так что бы а переменная попало


[13:38 - 13:57] в то место где хранится не значение а что то другое допустим у вас есть 2 переменные а переменная field переменная well и вы хотите сделать такой запрос в котором вот здесь стоит field


[13:57 - 14:13] идея состоит well as запрос по произвольному поля а вот на место поле подставлять а плот холдер нельзя вам нужно а либо


[14:13 - 14:29] ну не сработает моя прелесть скорей всего других базах не сработает так а вам необходимо вручную за эскейпить а field либо а проверять что


[14:29 - 14:46] в этом в этой переменной содержится именно те данные которые вы ожидаете например только только символ символ латинского алфавита и не длиннее скажем там 10 символов а такие проверки обеспечат вам безопасность выполнения запроса