Шаг 2. Создание базы данных SQL для разработки pyodbc Python
Создайте базу данных SQL с помощью SQL Azure или SQL Server.
Предварительные условия
- Python 3
- Если у вас еще нет Python, установите диспетчер пакетов Python и диспетчер пакетов Python (PyPI) из python.org.
- Предпочитаете не использовать собственную среду? Откройте в качестве devcontainer с помощью GitHub Codespaces.
- .
Создание базы данных SQL
Примеры в следующем разделе работают только со схемой AdventureWorks в Microsoft SQL Server или Базе данных SQL Azure.
- База данных SQL Azure
- Microsoft SQL Server
Не забудьте получить учетные данные для создаваемой базы данных.
Как создать базу данных в python
На этом шаге мы рассмотрим средства для выполнения указанных операций .
Для создания и открытия базы данных служит функция connect() . Функция имеет следующий формат:
connect( database[, timeout][, isolation_level][, detect_types] [, factory] [, check_same_thread] [, cached_statements] [, uri = False] )
В параметре database указывается абсолютный или относительный путь к базе данных. Если база данных не существует, то она будет создана и открыта для работы. Если база данных уже существует, то она просто открывается без удаления имеющихся данных. Вместо пути к базе данных можно указать значение :memory: , которое означает, что база данных будет создана в оперативной памяти, — после закрытия такой базы все данные будут удалены.
Все остальные параметры не являются обязательными и могут быть указаны в произвольном порядке путем присвоения значения названию параметра. Так, параметр timeout задает время ожидания снятия блокировки с открываемой базы данных (по умолчанию — пять секунд). Предназначение остальных параметров мы рассмотрим позже.
Функция connect() возвращает объект соединения , с помощью которого осуществляется вся дальнейшая работа с базой данных. Если открыть базу данных не удалось, то возбуждается исключение. Соединение закрывается, когда вызывается метод close() объекта соединения. В качестве примера откроем и сразу закроем базу данных testdb.db , расположенную в каталоге book на диске C:\ :
>>> import sqlite3 # Подключаем модуль sqlite3 >>> con = sqlite3.connect ("C:\\book\\testdb.db") # Открываем базу данных >>> # Работаем с базой данных >>> con.close () # Закрываем базу данных
- mode= < Режим доступа >— задает режим доступа к базе. Поддерживаются значения:
- ro — только чтение,
- rw — чтение и запись (при этом база уже должна существовать),
- rwc — чтение и запись (если база данных не существует, она будет создана) и
- memory — база данных располагается исключительно в оперативной памяти и удаляется после закрытия;
Примеры доступа к базе данных по интернет-адресу:
>>> import sqlite3 >>> # Доступ к базе, хранящейся в файле c:\book\testdb.db >>> con = sqlite3.connect(r"file:///C:/book/testdb.db", uri = True) >>> con.close() >>> # Доступ только для чтения >>> con = sqlite3.connect(r"file:///C:/book/testdb.db?mode=ro", uri = True) >>> con.close() >>> # Доступ к неизменяемой базе данных >>> con = sqlite3.connect(r"file:///f:/data.db?immutable=1", uri = True) >>> con.close()
На следующем шаге мы рассмотрим выполнение запросов .
Руководство по SQLite в Python
SQL и Python — обязательные инструменты для любого специалиста в сфере анализа данных. Это руководство — все, что вам нужно для первоначальной настройки и освоения основ работы с SQLite в Python. Оно включает следующие пункты:
- Загрузка библиотеки
- Создание и соединение с базой данных
- Создание таблиц базы данных
- Добавление данных
- Запросы на получение данных
- Удаление данных
- И многое другое!
SQLite3 (часто говорят просто SQLite) — это часть стандартного пакета Python 3, поэтому ничего дополнительно устанавливать не придется.
Что будем создавать
В процессе этого руководства создадим базу данных в SQLite с помощью Python, несколько таблиц и настроим отношения:
Типы данных SQLite в Python
SQLite для Python предлагает меньше типов данных, чем есть в других реализациях SQL. С одной стороны, это накладывает ограничения, но, с другой стороны, в SQLite многое сделано проще. Вот основные типы:
- NULL — значение NULL
- INTEGER — целое число
- REAL — число с плавающей точкой
- TEXT — текст
- BLOB — бинарное представление крупных объектов, хранящееся в точности с тем, как его ввели
К сожалению, других привычных для SQL типов данных в SQLite нет.
Первые шаги с SQLite в Python
Начнем руководство с загрузки библиотеки. Для этого нужно использовать следующую команду:
import sqlite3Следующий шаг — создание базы данных.
Создание базы данных SQLite в Python
Есть несколько способов создания базы данных в Python с помощью SQLite. Для этого используется объект Connection , который и представляет собой базу. Он создается с помощью функции connect() .
Создадим файл .db , поскольку это стандартный способ управления базой SQLite. Файл будет называться orders.db . За соединение будет отвечать переменная conn .
conn = sqlite3.connect('orders.db')Эта строка создает объект connection , а также новый файл orders.db в рабочей директории. Если нужно использовать другую, ее нужно обозначить явно:
conn = sqlite3.connect(r'ПУТЬ-К-ПАПКИ/orders.db')Если файл уже существует, то функция connect осуществит подключение к нему.
перед строкой с путем стоит символ «r». Это дает понять Python, что речь идет о «сырой» строке, где символы «/» не отвечают за экранирование.
Функция connect создает соединение с базой данных SQLite и возвращает объект, представляющий ее.
Резидентная база данных
Еще один способ создания баз данных с помощью SQLite в Python — создание их в памяти. Это отличный вариант для тестирования, ведь такие базы существуют только в оперативной памяти.
conn = sqlite3.connect(:memory:)Однако в большинстве случаев (и в этом руководстве) будет использоваться описанный до этого способ.
Создание объекта cursor
После создания объекта соединения с базой данных нужно создать объект cursor . Он позволяет делать SQL-запросы к базе. Используем переменную cur для хранения объекта:
cur = conn.cursor()Теперь выполнять запросы можно следующим образом:
cur.execute("ВАШ-SQL-ЗАПРОС-ЗДЕСЬ;")Обратите внимание на то, что сами запросы должны быть помещены в кавычки — это важно. Это могут быть одинарные, двойные или тройные кавычки. Последние используются в случае особенно длинных запросов, которые часто пишутся на нескольких строках.
Создание таблиц в SQLite в Python
Пришло время создать первую таблицу в базе данных. С объектами соединения ( conn ) и cursor ( cur ) это можно сделать. Будем следовать этой схеме.

Начнем с таблицы users .
cur.execute("""CREATE TABLE IF NOT EXISTS users( userid INT PRIMARY KEY, fname TEXT, lname TEXT, gender TEXT); """) conn.commit()В коде выше выполняются следующие операции:
- Функция execute отвечает за SQL-запрос
- SQL генерирует таблицу users
- IF NOT EXISTS поможет при попытке повторного подключения к базе данных. Запрос проверит, существует ли таблица. Если да — проверит, ничего ли не поменялось.
- Создаем первые четыре колонки: userid , fname , lname и gender . Userid — это основной ключ.
- Сохраняем изменения с помощью функции commit для объекта соединения.
Для создания второй таблицы просто повторим последовательность действий, используя следующие команды:
cur.execute("""CREATE TABLE IF NOT EXISTS orders( orderid INT PRIMARY KEY, date TEXT, userid TEXT, total TEXT); """) conn.commit()После исполнения этих двух скриптов база данных будет включать две таблицы. Теперь можно добавлять данные.
Добавление данных с SQLite в Python
По аналогии с запросом для создания таблиц для добавления данных также нужно использовать объект cursor .
cur.execute("""INSERT INTO users(userid, fname, lname, gender) VALUES('00001', 'Alex', 'Smith', 'male');""") conn.commit()В Python часто приходится иметь дело с переменными, в которых хранятся значения. Например, это может быть кортеж с информацией о пользователе.
user = ('00002', 'Lois', 'Lane', 'Female')Если его нужно загрузить в базу данных, тогда подойдет следующий формат:
cur.execute("INSERT INTO users VALUES(?, ?, ?, ?);", user) conn.commit()В данном случае все значения заменены на знаки вопроса и добавлен параметр, содержащий значения, которые нужно добавить.
Важно заметить, что SQLite ожидает получить значения в формате кортежа. Однако в переменной может быть и список с набором кортежей. Таким образом можно добавить несколько пользователей:
more_users = [('00003', 'Peter', 'Parker', 'Male'), ('00004', 'Bruce', 'Wayne', 'male')]Но нужно использовать функцию executemany вместо обычной execute :
cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?);", more_users) conn.commit()Если применить execute , то функция подумает, то пользователь хочет передать в таблицу два объекта (два кортежа), а не два кортежа, каждый из которых содержит по 4 значения для каждого пользователя. Хотя в первую очередь вообще должна была возникнуть ошибка.
SQLite и предотвращение SQL-инъекций
Использование способа с вопросительными знаками (?, ?, …) также помогает противостоять SQL-инъекциям. Поэтому рекомендуется использовать его, а не упомянутый до этого.
Скрипты для загрузки данных
Следующие скрипты можно скопировать и вставить для добавления данных в обе таблицы:
customers = [ ('00005', 'Stephanie', 'Stewart', 'female'), ('00006', 'Sincere', 'Sherman', 'female'), ('00007', 'Sidney', 'Horn', 'male'), ('00008', 'Litzy', 'Yates', 'female'), ('00009', 'Jaxon', 'Mills', 'male'), ('00010', 'Paul', 'Richard', 'male'), ('00011', 'Kamari', 'Holden', 'female'), ('00012', 'Gaige', 'Summers', 'female'), ('00013', 'Andrea', 'Snow', 'female'), ('00014', 'Angelica', 'Barnes', 'female'), ('00015', 'Leah', 'Pitts', 'female'), ('00016', 'Dillan', 'Olsen', 'male'), ('00017', 'Joe', 'Walsh', 'male'), ('00018', 'Reagan', 'Cooper', 'male'), ('00019', 'Aubree', 'Hogan', 'female'), ('00020', 'Avery', 'Floyd', 'male'), ('00021', 'Elianna', 'Simmons', 'female'), ('00022', 'Rodney', 'Stout', 'male'), ('00023', 'Elaine', 'Mcintosh', 'female'), ('00024', 'Myla', 'Mckenzie', 'female'), ('00025', 'Alijah', 'Horn', 'female'), ('00026', 'Rohan', 'Peterson', 'male'), ('00027', 'Irene', 'Walters', 'female'), ('00028', 'Lilia', 'Sellers', 'female'), ('00029', 'Perla', 'Jefferson', 'female'), ('00030', 'Ashley', 'Klein', 'female') ] orders = [ ('00001', '2020-01-01', '00025', '178'), ('00002', '2020-01-03', '00025', '39'), ('00003', '2020-01-07', '00016', '153'), ('00004', '2020-01-10', '00015', '110'), ('00005', '2020-01-11', '00024', '219'), ('00006', '2020-01-12', '00029', '37'), ('00007', '2020-01-14', '00028', '227'), ('00008', '2020-01-18', '00010', '232'), ('00009', '2020-01-22', '00016', '236'), ('00010', '2020-01-26', '00017', '116'), ('00011', '2020-01-28', '00028', '221'), ('00012', '2020-01-31', '00021', '238'), ('00013', '2020-02-02', '00015', '177'), ('00014', '2020-02-05', '00025', '76'), ('00015', '2020-02-08', '00022', '245'), ('00016', '2020-02-12', '00008', '180'), ('00017', '2020-02-14', '00020', '190'), ('00018', '2020-02-18', '00030', '166'), ('00019', '2020-02-22', '00002', '168'), ('00020', '2020-02-26', '00021', '174'), ('00021', '2020-02-29', '00017', '126'), ('00022', '2020-03-02', '00019', '211'), ('00023', '2020-03-05', '00030', '144'), ('00024', '2020-03-09', '00012', '112'), ('00025', '2020-03-10', '00006', '45'), ('00026', '2020-03-11', '00004', '200'), ('00027', '2020-03-14', '00015', '226'), ('00028', '2020-03-17', '00030', '189'), ('00029', '2020-03-20', '00004', '152'), ('00030', '2020-03-22', '00026', '239'), ('00031', '2020-03-23', '00012', '135'), ('00032', '2020-03-24', '00013', '211'), ('00033', '2020-03-27', '00030', '226'), ('00034', '2020-03-28', '00007', '173'), ('00035', '2020-03-30', '00010', '144'), ('00036', '2020-04-01', '00017', '185'), ('00037', '2020-04-03', '00009', '95'), ('00038', '2020-04-06', '00009', '138'), ('00039', '2020-04-10', '00025', '223'), ('00040', '2020-04-12', '00019', '118'), ('00041', '2020-04-15', '00024', '132'), ('00042', '2020-04-18', '00008', '238'), ('00043', '2020-04-21', '00003', '50'), ('00044', '2020-04-25', '00019', '98'), ('00045', '2020-04-26', '00017', '167'), ('00046', '2020-04-28', '00009', '215'), ('00047', '2020-05-01', '00014', '142'), ('00048', '2020-05-05', '00022', '173'), ('00049', '2020-05-06', '00015', '80'), ('00050', '2020-05-07', '00017', '37'), ('00051', '2020-05-08', '00002', '36'), ('00052', '2020-05-10', '00022', '65'), ('00053', '2020-05-14', '00019', '110'), ('00054', '2020-05-18', '00017', '36'), ('00055', '2020-05-21', '00008', '163'), ('00056', '2020-05-24', '00024', '91'), ('00057', '2020-05-26', '00028', '154'), ('00058', '2020-05-30', '00022', '130'), ('00059', '2020-05-31', '00017', '119'), ('00060', '2020-06-01', '00024', '137'), ('00061', '2020-06-03', '00017', '206'), ('00062', '2020-06-04', '00013', '100'), ('00063', '2020-06-05', '00021', '187'), ('00064', '2020-06-09', '00025', '170'), ('00065', '2020-06-11', '00011', '149'), ('00066', '2020-06-12', '00007', '195'), ('00067', '2020-06-14', '00015', '30'), ('00068', '2020-06-16', '00002', '246'), ('00069', '2020-06-20', '00028', '163'), ('00070', '2020-06-22', '00005', '184'), ('00071', '2020-06-23', '00022', '68'), ('00072', '2020-06-27', '00013', '92'), ('00073', '2020-06-30', '00022', '149'), ('00074', '2020-07-04', '00002', '65'), ('00075', '2020-07-05', '00017', '88'), ('00076', '2020-07-09', '00007', '156'), ('00077', '2020-07-13', '00010', '26'), ('00078', '2020-07-16', '00008', '55'), ('00079', '2020-07-20', '00019', '81'), ('00080', '2020-07-22', '00011', '78'), ('00081', '2020-07-23', '00026', '166'), ('00082', '2020-07-27', '00014', '65'), ('00083', '2020-07-30', '00021', '205'), ('00084', '2020-08-01', '00026', '140'), ('00085', '2020-08-05', '00006', '236'), ('00086', '2020-08-06', '00021', '208'), ('00087', '2020-08-07', '00021', '169'), ('00088', '2020-08-08', '00004', '157'), ('00089', '2020-08-11', '00017', '71'), ('00090', '2020-08-13', '00025', '89'), ('00091', '2020-08-16', '00014', '249'), ('00092', '2020-08-18', '00012', '59'), ('00093', '2020-08-19', '00013', '121'), ('00094', '2020-08-20', '00025', '179'), ('00095', '2020-08-22', '00017', '208'), ('00096', '2020-08-26', '00024', '217'), ('00097', '2020-08-28', '00004', '206'), ('00098', '2020-08-30', '00017', '114'), ('00099', '2020-08-31', '00017', '169'), ('00100', '2020-09-02', '00022', '226') ]Используйте следующие запросы:
cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?);", customers) cur.executemany("INSERT INTO orders VALUES(?, ?, ?, ?);", orders) conn.commit()Получение данных с SQLite в Python
Следующий момент касательно SQLite в Python — выбор данных. Структура формирования запроса та же, но к ней будет добавлен еще один элемент.
Использование fetchone() в SQLite в Python
Начнем с использования функции fetchone() . Создадим переменную one_result для получения только одного результата:
cur.execute("SELECT * FROM users;") one_result = cur.fetchone() print(one_result)Она вернет следующее:
[(1, 'Alex', 'Smith', 'male')]Использование fetchmany() в SQLite в Python
Если же нужно получить много данных, то используется функция fetchmany() . Выполним другой скрипт для генерации 3 результатов:
cur.execute("SELECT * FROM users;") three_results = cur.fetchmany(3) print(three_results)Он вернет следующее:
[(1, 'Alex', 'Smith', 'male'), (2, 'Lois', 'Lane', 'Female'), (3, 'Peter', 'Parker', 'Male')]Использование fetchall() в SQLite в Python
Функцию fetchall() можно использовать для получения всех результатов. Вот что будет, если запустить скрипт:
cur.execute("SELECT * FROM users;") all_results = cur.fetchall() print(all_results)Удаление данных в SQLite в Python
Теперь рассмотрим процесс удаления данных с SQLite в Python. Здесь та же структура. Предположим, нужно удалить любого пользователя с фамилией «Parker». Напишем следующее:
cur.execute("DELETE FROM users WHERE lname='Parker';") conn.commit()Если затем сделать следующей запрос:
cur.execute("select * from users where lname='Parker'") print(cur.fetchall())Будет выведен пустой список, подтверждающий, что запись удалена.
Объединение таблиц в SQLite в Python
Наконец, посмотрим, как использовать объединение данных для более сложных запросов. Предположим, нужно сгенерировать запрос, включающий имя и фамилию каждого покупателя заказа.
Для этого напишем следующее:
cur.execute("""SELECT *, users.fname, users.lname FROM orders LEFT JOIN users ON users.userid=orders.userid;""") print(cur.fetchall())Тот же подход работает с другими SQL-операциями.
Выводы
В этом материале вы узнали все, что требуется для работы с SQLite в Python: загрузка библиотеки, создание баз и таблиц, добавление, запрос и удаление данных.
Классы Python для базы данных MySQL: SELECT, INSERT и DELETE с pymysql

Сегодня разберёмся с классами Python на примере MySQL. Эта база данных достаточно производительная, чтобы обрабатывать большое количество запросов. На ней работают как небольшие сайты, так и корпорации типа Amazon (подробнее с историей этой СУБД можно ознакомиться тут ).
- Компьютер или ноутбук
- Редактор кода (У меня PyCharm)
- Python версии 3.9 и выше
- Соединение с интернетом
Установка для Windows:
pip install pymysqlpip3 install pymysqlУстановка MySQL
Самый простой способ — задействовать программу OpenServer. Эта программа помогает локально поднимать сервера для сайтов и отображать их в браузере. Мы будем использовать её для быстрого доступа к БД.
1. Скачиваем установочный файл отсюда
2. Запускаем его и следуем всем инструкциям
3. Запускаем OpenServer и ищем внизу флажок:

4. Кликаем на него и выбираем пункт настройки:

5. Ищем в настройках вкладку модули:

6. Если в выпадающем меню «MySQL/MariaDB» выставлено «не использовать», кликаем и выбираем самую последнюю версию СУБД MySQL:

Настройка базы данных MySQL в PhpMyAdmin
Запускаем сервер в OpenServer, наводим на вкладку «дополнительно» и нажимаем на «PhpMyAdmin»:

Дальше вас перекидывает на сайт, где мы вводим логин «root».
Поле «пароль» остается пустым.
В главном меню нам нужен пункт «создать БД». В этом окне придумываем имя базы данных и нажимаем «создать» (тип кодировки не трогаем, оставляем стандартный). После всех манипуляций у нас есть база данных. Остается создать таблицу внутри:

Придумываем имя таблицы и добавляем несколько столбцов.
Нам потребуется 4 столбца, добавляем их и нажимаем «вперед»:
Итак, наша база данных готова. Если вы хотите подробнее углубиться в работу с базой данных на MySQL, посмотрите видео тут .
Создаём класс MySQL на Python
Почему классы удобнее всего использовать для взаимодействия с БД?
У нас будет множество методов для взаимодействия с базой.
Добавление и удаление пользователей, выборка данных, внесение изменений в базу и много чего ещё. Было бы неправильным вызывать каждый раз несколько функций и передавать в них одни и те же параметры и конструкции.Давайте сформируем класс для базы данных MySQL и добавим для него несколько полезных методов.
import pymysql class MySQL: def __init__(self, host, port, user, password, db_name): self.connection = pymysql.connect( host=host, port=port, user=user, password=password, database=db_name, cursorclass=pymysql.cursors.DictCursor )С импортами тут все ясно — подключаем нашу библиотеку для работы с MySQL.
Что такое __init__? Эта конструкция будет срабатывать при создании объекта класса. Внутрь нее мы передаём аргументы для создания подключения к базе данных. Также, мы передаём поле connection на хранение внутрь класса, чтобы оно не пропало. Далее мы будем активно использовать connection для обращения к базе.
def add_user(self, name, age, email): insert_query = f"INSERT INTO `user` (name, age, email) VALUES (, , )" with self.connection.cursor() as cursor: cursor.execute(insert_query) self.connection.commit()Метод add_user – тут мы будем создавать новую запись с пользователем, передаем его имя, возраст и почту. Внутри insert_query хранится запрос на языке SQL (обычная строка), в него мы и подставляем добавляемые значения.
Для выполнения запроса используем curcor.execute , а для сохранения — connection.commit .def del_user(self, id): delete_query = f"DELETE FROM `user` WHERE with self.connection.cursor() as cursor: cursor.execute(delete_query) self.connection.commit()Метод del_user – тут мы ищем по ID в базе данных человека и удаляем эту строчку.
def update_age_by_id(self, new_age, id): update_query = f"UPDATE `user` SET age = WHERE with self.connection.cursor() as cursor: cursor.execute(update_query) self.connection.commit()В метод update_age_by_id поступают новый возраст человека и его ID, чтобы было можно его найти.
def select_all_data(self): select_all_rows = f"SELECT * FROM `user`" with self.connection.cursor() as cursor: cursor.execute(select_all_rows) rows = cursor.fetchall() return rowsМетод select_all_data делает запрос к базе на получение всех строчек, которые есть в таблице. Результат возвращается в виде объекта, который мы превращаем в список с помощью fetchall .
def __del__(self): self.connection.close()Метод __del__ срабатывает, когда объект уничтожается. Это нужно, поскольку по документации pymysql нужно закрывать сессию подключения к БД после окончания работы. Поэтому внутри этого метода мы обращаемся к connection и вызываем метод close .
Весь класс с методами будет выглядеть так:
import pymysql class MySQL: def __init__(self, host, port, user, password, db_name): self.connection = pymysql.connect( host=host, port=port, user=user, password=password, database=db_name, cursorclass=pymysql.cursors.DictCursor ) def add_user(self, name, age, email): insert_query = f"INSERT INTO `user` (name, age, email) VALUES ('', , '')" with self.connection.cursor() as cursor: cursor.execute(insert_query) self.connection.commit() def del_user(self, id): delete_query = f"DELETE FROM `user` WHERE with self.connection.cursor() as cursor: cursor.execute(delete_query) self.connection.commit() def update_age_by_id(self, new_age, id): update_query = f"UPDATE `user` SET age = WHERE with self.connection.cursor() as cursor: cursor.execute(update_query) self.connection.commit() def select_all_data(self): select_all_rows = f"SELECT * FROM `user`" with self.connection.cursor() as cursor: cursor.execute(select_all_rows) rows = cursor.fetchall() return rows def __del__(self): self.connection.close()Использование класса MySQL
Чтобы начать работу с БД через Python, нам надо передать в объект класса MySQL ряд параметров — IP, порт, логин, пароль и название самой базы данных:
host = '127.0.0.1' port = 3306 user = 'root' password = '' db_name = 'user' bd = MySQL(host=host, port=port, user=user, password=password, db_name=db_name)После этого мы сможем обращаться к методам объекта bd.
Давайте добавим несколько пользователей:db.add_user('Анна', 26, 'anna.holkon@gmail.com') db.add_user('Егор', 19, 'egor22jokelton@mail.ru')Тем самым мы в таблицу добавили Анну и Егора.
print(db.select_all_data())Выводим в консоль весь массив данных с помощью метода select_all_data :
Как это выглядит в PhpMyAdmin:

Удалим пользователя 1 из таблицы:
db.del_user(1)Проверяем базу данных:

Попробуем поменять возраст второго пользователя:
db.update_age_by_id(12, 2)Егору было 19 лет, стало 12:

Заключение
Мы разобрали создание базы данных на СУБД MySQL, создали класс на Python для управления базой и добавили несколько полезных методов. Для усвоения материала рекомендуем повторить наши манипуляции, а также написать парочку собственных методов.
Думаю, вы заметили насколько лёгким становится управление базой если задействовать классы и методы Python. Теперь вы без труда сможете применить их для управления своей базой данных, а может быть и для автоматизации процессов на реальном проекте.
