мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| zadanie_3 [2024/03/03 18:35] – создано wikiadmin | zadanie_3 [2024/03/12 09:35] (текущий) – wikiadmin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====Задание №3==== | ====Задание №3==== | ||
| + | ==Шаг 1. SQL== | ||
| + | Основные варианты СУБД (систем управления баз данных): | ||
| + | |||
| + | * PostgreSQL | ||
| + | * MySQL | ||
| + | * SQLite | ||
| + | |||
| + | **SQLite** – самый простой вариант создания базы данных. У SQLite нет поддержки клиент/ | ||
| + | Для небольших баз данных SQLite – идеальный вариант. | ||
| + | |||
| + | ==Шаг 2. Установка SQLite== | ||
| + | Для начала необходимо установить пакет sqlite3. | ||
| + | Перед установкой новых пакетов рекомендуется обновить имеющиеся пакеты. Для этого выполняем команду: | ||
| + | <code Bash> | ||
| + | < | ||
| + | bsk23-01-student-1@BSK23-01-1: | ||
| + | Get:1 file:/ | ||
| + | Get:5 file:/ | ||
| + | Hit:2 https:// | ||
| + | Hit:3 https:// | ||
| + | Hit:4 https:// | ||
| + | Hit:6 https:// | ||
| + | Reading package lists... Done | ||
| + | Building dependency tree... Done | ||
| + | Reading state information... Done | ||
| + | All packages are up to date. | ||
| + | bsk23-01-student-1@BSK23-01-1: | ||
| + | </ | ||
| + | |||
| + | <code Bash> | ||
| + | < | ||
| + | Reading package lists... Done | ||
| + | Building dependency tree... Done | ||
| + | Reading state information... Done | ||
| + | Suggested packages: | ||
| + | sqlite3-doc | ||
| + | The following NEW packages will be installed: | ||
| + | sqlite3 | ||
| + | 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. | ||
| + | Need to get 353 kB of archives. | ||
| + | After this operation, 546 kB of additional disk space will be used. | ||
| + | Get:1 file:/ | ||
| + | Get:2 https:// | ||
| + | Fetched 353 kB in 1s (326 kB/s) | ||
| + | Selecting previously unselected package sqlite3. | ||
| + | (Reading database ... 26808 files and directories currently installed.) | ||
| + | Preparing to unpack .../ | ||
| + | Unpacking sqlite3 (3.40.1-2) ... | ||
| + | Setting up sqlite3 (3.40.1-2) ... | ||
| + | Processing triggers for man-db (2.11.2-2) ... | ||
| + | bsk23-01-student-1@BSK23-01-1: | ||
| + | </ | ||
| + | |||
| + | Проверим, | ||
| + | |||
| + | <code Bash>apt list | grep –E ‘sqlite3.*installed’</ | ||
| + | |||
| + | В полученном списке должны увидеть: | ||
| + | |||
| + | sqlite3/ | ||
| + | |||
| + | ==Шаг 3. Справка по sqlite3== | ||
| + | Команда **man** отображает справку по использованию пакетов. | ||
| + | |||
| + | Посмотрим параметры запуска sqlite3 | ||
| + | |||
| + | man sqlite3 | ||
| + | < | ||
| + | SYNOPSIS | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Пункты в квадратных скобках говорят о том, что при запуске SQLite мы можем (но не обязаны) указать опции, имя базы данных и запрос SQL | ||
| + | |||
| + | If the database file does not exist, it will be created. | ||
| + | |||
| + | Если при запуске sqlite укажем имя несуществующей базы данных, | ||
| + | |||
| + | ==Шаг 4. Создание базы данных== | ||
| + | Смотрим в какой директории мы сейчас находимся: | ||
| + | pwd | ||
| + | Переходим в нужную директорию с помощью команды cd. | ||
| + | Запускаем SQLite с именем базы данных (пусть будет «pythondb»): | ||
| + | sqlite3 pythondb | ||
| + | |||
| + | < | ||
| + | SQLite version 3.40.1 2022-12-28 14:03:47 | ||
| + | Enter " | ||
| + | sqlite> | ||
| + | </ | ||
| + | |||
| + | Мы находимся в программе sqlite. Короткий текст советует нам посмотреть справку. Посмотрим: | ||
| + | sqlite> .help | ||
| + | Выполним команду отображения подключенных баз данных: | ||
| + | sqlite> .databases | ||
| + | main: / | ||
| + | |||
| + | ==Шаг 5. Создание таблицы CREATE TABLE== | ||
| + | Команды в SQL называют запросами. Создадим новую таблицу в нашей базе данных, | ||
| + | |||
| + | **Name** с типом //String// (в этом столбце будет текст) | ||
| + | |||
| + | **Age** с типом //Int// (в этом столбце будут целые числа) | ||
| + | |||
| + | **Mac** с типом //String// (в этом поле будем указывать MAC-адрес телефона пользователя) | ||
| + | |||
| + | sqlite> CREATE TABLE users(name String, age Int, mac String); | ||
| + | |||
| + | Посмотрим, | ||
| + | sqlite> .tables | ||
| + | users | ||
| + | |||
| + | ==Шаг 6. Заполнение данных таблицы INSERT== | ||
| + | Добавим в созданную таблицу данные. Для этого используем SQL запрос «INSERT». | ||
| + | |||
| + | Указываем, | ||
| + | |||
| + | Данные задаём после «VALUES». Каждая строка в круглых скобках через запятую. | ||
| + | |||
| + | Внутри круглых скобок значения полей name (строка в кавычках) и age. «(' | ||
| + | |||
| + | sqlite> INSERT INTO users(name, age, mac) VALUES (' | ||
| + | |||
| + | ==Шаг 7. Отображение данных таблицы SELECT== | ||
| + | Отобразим данные из таблицы users. Это делается SQL запросом «SELECT». После «SELECT» указывается список столбцов, | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT * FROM users; | ||
| + | |||
| + | Ivan|25|mac1 | ||
| + | Dasha|23|mac2 | ||
| + | Juliya|21|mac3 | ||
| + | </ | ||
| + | |||
| + | Включим отображение заголовков столбцов: | ||
| + | sqlite> .headers on | ||
| + | Снова отобразим данные из таблицы users. Теперь с заголовками столбцов «name|age|mac»: | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT * FROM users; | ||
| + | |||
| + | name|age|mac | ||
| + | Ivan|25|mac1 | ||
| + | Dasha|23|mac2 | ||
| + | Juliya|21|mac3 | ||
| + | </ | ||
| + | |||
| + | Для того, чтобы выбрать только один столбец в списке полей вместо «*» нужно написать название столбца: | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT name FROM users; | ||
| + | |||
| + | name | ||
| + | Ivan | ||
| + | Dasha | ||
| + | Juliya | ||
| + | </ | ||
| + | |||
| + | Можно указать несколько столбцов через запятую. Столбцы будут отображаться в указанном в запросе порядке: | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT age,name FROM users; | ||
| + | |||
| + | age|name | ||
| + | 25|Ivan | ||
| + | 23|Dasha | ||
| + | 21|Juliya | ||
| + | </ | ||
| + | |||
| + | ==Шаг 8. Условия выборки WHERE== | ||
| + | Выберем не все данные, | ||
| + | |||
| + | <code SQLite> | ||
| + | sqlite> SELECT age,name FROM users WHERE age<24; | ||
| + | |||
| + | age|name | ||
| + | 23|Dasha | ||
| + | 21|Juliya | ||
| + | </ | ||
| + | Получили только 2 записи, | ||
| + | Можно выполнить поиск по конкретному условию: | ||
| + | |||
| + | <code SQLite> | ||
| + | sqlite> SELECT name,age FROM users WHERE name=’Juliya’; | ||
| + | |||
| + | name|age | ||
| + | Juliya|21 | ||
| + | </ | ||
| + | |||
| + | ==Шаг 9. Создание и заполнение второй таблицы== | ||
| + | Создадим вторую таблицу. Это будет таблица MAC-адресов активных регистраций устройств WiFi-роутера с уровнями сигналов: | ||
| + | sqlite> CREATE TABLE registrations (mac String, signal String); | ||
| + | Посмотрим обновленный список таблиц в нашей базе данных: | ||
| + | |||
| + | < | ||
| + | sqlite> .tables | ||
| + | |||
| + | registrations users | ||
| + | </ | ||
| + | |||
| + | Пока добавим в таблицу registrations данные вручную (в дальнейшем нам нужно будет автоматически записывать данные, | ||
| + | |||
| + | sqlite> INSERT INTO registrations (mac, signal) VALUES (' | ||
| + | |||
| + | Отобразим данные из этой таблицы: | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT * FROM registrations; | ||
| + | |||
| + | mac|signal | ||
| + | mac3|-72 | ||
| + | mac1|-85 | ||
| + | mac5|-69 | ||
| + | </ | ||
| + | |||
| + | ==Шаг 10. Связь двух таблиц== | ||
| + | Теперь наша задача – связать 2 таблицы: | ||
| + | |||
| + | < | ||
| + | sqlite> SELECT * FROM users, registrations WHERE users.mac = registrations.mac; | ||
| + | |||
| + | name|age|mac|mac|signal | ||
| + | Ivan|25|mac1|mac1|-85 | ||
| + | Juliya|21|mac3|mac3|-72 | ||
| + | </ | ||
| + | |||
| + | Мы получили строки обеих таблиц, | ||
| + | Можно выбрать не все столбцы, | ||
| + | < | ||
| + | sqlite> SELECT users.name, registrations.signal FROM users, registrations WHERE users.mac = registrations.mac; | ||
| + | |||
| + | name|signal | ||
| + | Ivan|-85 | ||
| + | Juliya|-72 | ||
| + | </ | ||
| + | |||
| + | Для начала нам этого хватит. Мы вернемся в SQLite когда будем создавать таблицу пользователей WiFi роутера. | ||
| + | Теперь нам нужно научиться выполнять SQL запросы к базе данных SQLite из Python. | ||
| + | |||
| + | ==Шаг 11. SQL из Python== | ||
| + | В Python есть готовые библиотеки почти на все случаи жизни. Есть библиотека для работы с **sqlite3**. Эта библиотека содержит функции для подключения к базе данных SQLite, для выполнения SQL запросов к базе данных, | ||
| + | |||
| + | Для подключения библиотеки SQLite необходимо в начале скрипта написать **«import sqlite3»**. | ||
| + | |||
| + | Используем функции библиотеки «connect», | ||
| + | <code python> | ||
| + | import sqlite3 # | ||
| + | con = sqlite3.connect('/ | ||
| + | cur = con.cursor() # | ||
| + | cur.execute(' | ||
| + | users = cur.fetchall() # | ||
| + | print(users) #вывод массива users на экран | ||
| + | con.close() # | ||
| + | </ | ||
| + | |||
| + | Результат выполнения скрипта – массив данных (таблица): | ||
| + | [(' | ||
| + | |||
| + | ==Шаг 12. Выборочное чтение данных== | ||
| + | Для чтения одной строки массива (таблицы) нужно после названия массива «users» написать номер строки в квадратных скобках. Например «users[0]»: | ||
| + | |||
| + | <code python> | ||
| + | import sqlite3 | ||
| + | con = sqlite3.connect('/ | ||
| + | cur = con.cursor() | ||
| + | cur.execute(' | ||
| + | users = cur.fetchall() | ||
| + | print(users[0]) | ||
| + | con.close() | ||
| + | </ | ||
| + | |||
| + | Результат выполнения скрипта – первая (нулевая) строка массива: | ||
| + | (' | ||
| + | |||
| + | < | ||
| + | |||
| + | Для чтения одной ячейки массива (таблицы) нужно написать координаты ячейки таблицы после названия массива «users» в двух квадратных скобках [x][y], где x - номер строки, | ||
| + | Dasha | ||
| + | |||
| + | ==Шаг 13. Чтение данных в цикле== | ||
| + | Построчное чтение данных в цикле: | ||
| + | <code python> | ||
| + | import sqlite3 | ||
| + | con = sqlite3.connect('/ | ||
| + | cur = con.cursor() | ||
| + | cur.execute(' | ||
| + | users = cur.fetchall() | ||
| + | for user in users: | ||
| + | print(user) | ||
| + | con.close() | ||
| + | </ | ||
| + | |||
| + | Сохраним этот скрипт. Вернемся к нему после того как считаем данные о регистрациях устройств в WiFi сети роутера. | ||
| - | FIXME //В ПРОЦЕССЕ// | ||