Похожие презентации:
Лекция 14-15+
1.
Лекция 14База данных SQLite
Лекция 15
Подключение Python к базе данных
2.
База данныхБаза данных — это совокупность описаний объектов реального мира и
связей между ними, актуальных для конкретной прикладной области.
3.
Типы баз данных1.Реляционные базы данных:
1. Хранят данные в виде таблиц (строк и столбцов).
2. Связи между таблицами описываются с помощью ключей (первичных и
внешних).
3. Пример: MySQL, PostgreSQL, SQLite.
2.NoSQL базы данных:
1. Используются для неструктурированных данных.
2. Примеры: MongoDB (документ-ориентированная), Redis (ключ-значение).
3.Объектно-ориентированные базы данных:
1. Сохраняют данные в виде объектов, как в ООП.
2. Пример: db4o, ObjectDB.
4.Файловые системы:
1. Хранят данные в виде простых файлов (например, JSON, XML, CSV).
4.
Что такое реляционная база данных?Реляционные базы данных - это набор данных с
предопределенными связями между ними, работают с таблицами,
где каждая таблица имеет определённую структуру: Строки
(записи) содержат данные. Столбцы (поля) описывают свойства
данных.
5.
Реляционные БДРеляционная база данных – это
набор данных с предопределенными
связями между ними. Эти данные
организованны в виде набора
таблиц, состоящих из столбцов и
строк.
В таблицах хранится информация об
объектах, представленных в базе
данных.
В каждом столбце таблицы хранится
определенный тип данных, в каждой
ячейке – значение атрибута.
Каждая стока таблицы представляет
собой набор связанных значений,
относящихся к одному объекту или
сущности.
6.
Взаимосвязь таблиц базы данныхРуководитель
Первичный ключ
Номер
Фамилия
Отдел
Стаж
5742
Васильев
26К
25
6931
Успенский
31С
27
2345
Воробьев
19И
21
Внешний ключ
Сотрудник
Номер
Фамилия
Номер
руководителя
Должность
1234
Юдин
5742
М. н. с.
1235
Щедрин
6931
С. н. с.
1236
Яковлев
5742
Н. с.
1237
Кротов
2345
Вед. инж.
1238
Куркин
6931
Ст. инж.
В одной таблице содержатся
ассоциированные данные, а в
разных таблицах одной БД
находятся связанные данные.
7.
Сетевые БДВ сетевых базах данных
между таблицами и
записями может быть
несколько разных связей,
каждая из который
отвечает за что-то своё.
Особенность сетевой базы данных в том, что в ней запоминаются все связи и всё
содержимое для каждой связи. Базе не нужно тратить время на поиск нужных
данных, потому что вся информация об этом уже есть в специальных индексных
файлах. Они показывают, какая запись с какой связана, и быстро выдают
результат.
Сетевые базы данных: позволяют хранить много связей между множеством
объектов. Например, каталог фильмов: в одном фильме может участвовать много
человек, а каждый из них может участвовать во множестве фильмов.
8.
Иерархические БДИерархическая база
данных знает, кто кому
подчиняется, и поэтому
может быстро находить
нужную информацию. Но
такие базы можно
организовать только в
том случае, когда у вас
есть чёткое разделение в
данных, что главнее, а
что ему подчиняется.
9.
Язык SQLЧтобы управлять данными в базе,
например добавлять новые записи,
удалять старые или что-то искать,
используют
специальный
язык
запросов к базе — SQL.
Эти запросы обрабатывает СУБД —
система управления базами данных.
Это как движок для сайтов — он
выполняет запросы, работает с базой
и отдаёт нам результаты.
SQL —это язык запросов к базе данных. Название расшифровывается: «язык
структурированных запросов» (Structured Query Language). Это значит, что каждый
запрос к базе данных формируется по какой-то структуре, а сам язык задаёт
правила, как именно сделать такой запрос.
10.
После выбора определенной СУБД программист получаетдоступ к ее API (Application Programming Interface) – программному
интерфейсу для взаимодействия с СУБД. Фактически, к набору
функций, через которые производится работа с базами данных
11.
Что такое SQLiteSQLite —это легковесный язык запросов для реляционных баз данных,
который широко используется благодаря своей простоте и встроенности в
различные языки программирования, включая Python. SQLite не требует
настройки серверной части и хранит данные в одном файле на диске, что делает
её удобной для локального использования или небольших приложений. Python
предоставляет модуль sqlite3, который позволяет работать с SQLite.
12.
Язык SQL в SQLite• SQLite использует язык SQL, который является единственным и
универсальным
средством,
позволяющим
использовать
реляционную базу данных.
• SQL спроектирован для структурирование, чтения, записи,
сортирования, фильтрации, зашиты, генерации , группирование и
управления информацией.
• SQL — «Структурированный язык запросов» —
универсальный компьютерный язык, применяемый для создания,
модификации и управления данными в реляционных базах данных.
• SQL основывается на исчислении кортежей.
13.
Язык SQLSQL – Structured Query Language – язык структурированных запросов.
Условно подразделяется на:
DDL – Data Definition Language – язык определения данных
(операторы: CREATE, ALTER, DROP)
DML – Data Manipulation Language – язык манипулирования данными
(операторы: SELECT, INSERT, UPDATE, DELETE)
DCL – Data Control Language – язык определения доступа к данным
(операторы: GRANT, REVOKE, DENY)
TCL – Transaction Control Language - язык управления транзакциями
(операторы: COMMIT, ROLLBACK, SAVEPOINT)
14.
Основные особенности этого языка SQLЯзык SQL не чувствителен к регистру.
• Если пишется несколько операторов подряд, то в конце каждого ставится ";".
• Комментарии заключаются в "{ }" и "/* … */".
• Имена файлов, таблиц, полей, переменных нельзя писать по-русски и с
пробелом
Типы данных
15.
Основы SQL: операторы CRUDПосле создания необходимых таблиц, мы можем вносить в них данные. Для
обозначения основных действий с данными существует специальная
аббревиатура — CRUD (create, read, update, delete — «создать, прочесть,
обновить, удалить») — акроним, обозначающий четыре базовые функции,
используемые при работе с персистентными хранилищами данных.
В соответствии с CRUD в SQL имеются следующие операторы:
INSERT — оператор языка SQL, который позволяет добавить строку со
значениями в таблицу.
SELECT — оператор запроса в языке SQL, возвращающий набор данных
(выборку) из базы данных. Имеет множество опций.
UPDATE — оператор языка SQL, позволяющий обновить значения в заданных
столбцах таблицы.
DELETE — в языках, подобных SQL, операция удаления записей из таблицы.
Критерий отбора записей для удаления определяется выражением WHERE. В
случае, если критерий отбора не определён, выполняется удаление всех записей.
16.
Примерыоператоров CRUD
INSERT
INSERT INTO Employees (Name, Position, Bonus, Login, Password)
VALUES ('Иванов И.И.', 'инженер', 30000, 'ivanovi', 'ivanov123');
SELECT
SELECT * FROM Employees;
# или:
SELECT Id, Name, Bonus FROM Employees
WHERE Bonus > 20000 ORDER BY Bonus DESC LIMIT 3;
UPDATE
UPDATE Employees SET Bonus = 40000 WHERE Id = 1;
DELETE
DELETE FROM Employees;
# или:
DELETE FROM Employees WHERE Id = 5;
17.
SQLite: основа для локальных баз данныхSQLite — выделяется следующими характеристиками:
1.Файловая база данных: вся информация хранится в одном .db файле.
2.Встроенность: не требует установки отдельного сервера.
3.Компактность: занимает мало места и быстро работает.
4.Поддержка SQL: поддерживает основные команды SQL.
SQLite идеально подходит для:
•Локальных приложений.
•Прототипов.
•Программ, которые работают с ограниченным объёмом данных.
18.
Преимущества и недостатки SQLite1.Лёгкость и простота:
1. Нет необходимости в установке отдельного серверного ПО.
2. Файл базы данных представляет собой простой файл на диске.
2.Поддержка SQL:
1. SQLite поддерживает стандартный язык запросов SQL.
3.Встроенность:
1. SQLite встроен в Python с версии 2.5, что упрощает его использование.
4.Переносимость:
1. Файлы базы данных SQLite легко перемещать между системами.
5.Низкие накладные расходы:
1. SQLite экономно расходует ресурсы и подходит для приложений с
ограниченными ресурсами.
6. Основной минус: отсутствие авторизации при подключении. То есть, если кто-то
знает где лежит ваша база и она при этом открыта для полного доступа, то он может
считать все данные с этой базы.
19.
Лекция 15Подключение Python к
базе данных
20.
Подключение к SQLite в PythonДля установки соединения нужно указать название базы данных, к которой
требуется подключиться. Если указать название той, что уже есть на диске, то
произойдет подключение. Если же указать другое, то SQLite создаст новую базу
данных.
Для подключения к SQLite нужно выполнить следующие шаги
• import sqlite3
• Использовать метод connect() из модуля sqlite3 и передать в качестве аргумента
название базы данных – открываем соединение.
• Создать объект cursor для выполнения SQLite-запросов из Python. Вызов метода
execute(query) для объекта Cursor выполняет запрос и в случае наличия результата
возвращает ответ, который можно получить методом fetchall().
• Закрыть объект cursor после завершения работы.
• Перехватить исключение базы данных, если в процессе подключения произошла
ошибка.
21.
Работа с БД в Python через DB-APIPEP 249 определяет DP-API - набор методов и интерфейсов для работы с базами
данных. DB-API предоставляет универсальный интерфейс, который используется
библиотеками для работы с конкретными СУБД.
22.
Методы и функции DB-API1. Методы объекта подключения:
•connect(): устанавливает соединение с базой данных.
•commit(): сохраняет изменения (фиксация транзакции).
•rollback(): откатывает изменения.
•close(): закрывает соединение.
2. Методы объекта курсора:
•execute(query, params): выполняет SQL-запрос.
•executemany(query, params_list): выполняет SQL-запрос для набора параметров.
•fetchone(): извлекает одну запись результата.
•fetchall(): извлекает все записи результата.
•fetchmany(size): извлекает указанное количество записей.
3. Исключения DB-API:
•DatabaseError: общее исключение для ошибок базы данных.
•IntegrityError: нарушение ограничений целостности (например, уникальности).
•OperationalError: ошибки работы с базой данных (например, недоступность).
•ProgrammingError: ошибки в SQL-запросах или неправильное использование API.
23.
Интерфейс модуля• Доступ к базе данных осуществляется с помощью объектасоединения (connection object). DB-API-совместимый модуль
должен предоставлять функцию конструктор connect() для класса
объектов-соединений.
• Конструктор должен иметь следующие именованные параметры:
• dsn Название источника данных в виде строки
• user Имя пользователя
• password Пароль
• host Адрес хоста, на котором работает СУБД
• database Имя базы данных
24.
Объект-соединение• Объект-соединение, получаемый в результате успешного вызова
функции connect(), должен иметь следующие методы:
• close() Закрывает соединение с базой данных.
• commit() Завершает транзакцию.
• rollback() Откатывает начатую транзакцию (восстанавливает исходное
состояние). Закрытие соединения при незавершенной транзакции
автоматически производит откат транзакции.
• cursor() Возвращает объект-курсор, использующий данное соединение.
• Если база данных не поддерживает курсоры, модуль сопряжения
должен их имитировать
25.
Транзакция• Транзакция – это группа из одной или нескольких операций,
которые изменяют базу данных
• Транзакция соответствует логически неделимой операции над
базой данных, а частичное выполнение транзакции приводит к
нарушению целостности БД
• Например, при переводе денег с одного счета на другой операции по
уменьшению первого счета и увеличению второго являются транзакцией.
• Методы commit() и rollback() обозначают начало и конец
транзакции в явном виде
• Не все базы данных поддерживают механизм транзакций
26.
Объект-курсор• Курсор (от англ. cursor - CURrrent Set Of Records, текущий набор
записей) служит для работы с результатом запроса. Результатом
запроса обычно является одна или несколько прямоугольных
таблиц со столбцами-полями и строками-записями
• Приложение может читать и обрабатывать полученные таблицы и
записи в таблице по одной, поэтому в курсоре хранится
информация о текущей таблице и записи
• Конкретный курсор в любой момент времени связан с
выполнением одной SQL-инструкции
27.
Атрибуты объекта-курсора• arraysize Атрибут, равный количеству записей, возвращаемых
методом fetchmany(). По умолчанию равен 1
• callproc(procname[, params]) Вызывает хранимую процедуру
procname с параметрами из изменчивой последовательности
params. Хранимая процедура может изменить значения некоторых
параметров последовательности. Метод может возвратить
результат, доступ к которому осуществляется через fetch - методы
• close() Закрывает объект-курсор
• description Этот доступный только для чтения атрибут является
последовательностью из семи элементных последовательностей
(name, type_code, display_size, internal_size, precision, scale, null_ok)
28.
Атрибуты объекта-курсора• execute(operation[, parameters]) Исполняет запрос к базе
данных или команду СУБД.
• executemany(operation, seq_of_parameters) Выполняет серию
запросов или команд, подставляя параметры в заданный
шаблон.
• fetchall() Возвращает все (или все оставшиеся) записи
результата запроса.
29.
Основы работы с SQLite в PythonДля работы с SQLite в Python используется модуль sqlite3. Основные этапы
работы включают:
1.Подключение к базе данных.
2.Создание таблиц.
3.Вставка, обновление и удаление данных.
4.Выполнение запросов.
5.Закрытие соединения.
30.
Подключение к базе данныхДля подключения используется метод sqlite3.connect():
•Если файл базы данных существует, он будет открыт.
•Если файл не существует, он будет создан.
31.
import sqlite3Python имеет встроенную поддержку SQLite базы данных, для
этого не требуется ничего дополнительно устанавливать, достаточно в
скрипте указать импорт стандартной библиотек
32.
Пример БД33.
БД ОГО (одной грандиознойорганизации) через DB-API
Для работы с SQLite в Python используется библиотека sqlite3.
# Импортируем библиотеку, соответствующую типу нашей базы данных
import sqlite3
# Файл базы данных
# Если вместо файла указать :memory:, то база будет создана
# в оперативной памяти, а не в файле.
db_name = "ogo.db"
# Создаем соединение с нашей базой данных
# Если файл базы данных еще не создан, он создастся автоматически.
conn = sqlite3.connect(db_name)
# При необходимости меняем тип row_factory, чтоб в ответах
# базы данных отображались названия атрибутов.
conn.row_factory = sqlite3.Row
# РАБОТАЕМ С БАЗОЙ
# Не забываем закрыть соединение с базой данных после работы
conn.close()
34.
Конфигурирование: CREATE# Конфигурирование базы данных (если необходимо выполнить в скрипте)
def configure_db(conn):
cur = conn.cursor()
# Создаем таблицу Employees
cur.execute("CREATE TABLE Employees"
"
(Id
INTEGER
"
Name
CHAR(128)
"
Position CHAR(64)
"
Bonus
INTEGER
"
Login
CHAR(16)
"
Password CHAR(16)
PRIMARY KEY
NOT NULL,"
NOT NULL,"
DEFAULT 0,"
NOT NULL,"
NOT NULL)")
AUTOINCREMENT,"
# Создаем таблицу Projects
cur.execute("CREATE TABLE Projects"
"
(Id
INTEGER
"
Name
CHAR(128)
PRIMARY KEY
NOT NULL)")
AUTOINCREMENT,"
# Создаем таблицу PositionSalary
cur.execute("CREATE TABLE PositionSalary"
"
(Position CHAR(64)
PRIMARY KEY
"
Salary
INTEGER
NOT NULL)")
NOT NULL,"
# Создаем таблицу EmployeeProject
cur.execute("CREATE TABLE EmployeeProject"
"
(EmployeeId INTEGER,"
"
ProjectId
INTEGER,"
"
PRIMARY KEY (EmployeeId, ProjectId))")
35.
Добавление записей: INSERT# Добавление записей в таблицу Проекты
def insert_project(conn, name):
# Создаем курсор - специальный объект,
# который делает запросы и получает их результаты
cur = conn.cursor()
# Делаем INSERT запрос к базе данных, используя обычный SQL-синтаксис
cur.execute("INSERT INTO Projects (Name)"
" VALUES (:name)",
{'name': name})
# Если мы не просто читаем, но и вносим изменения в базу данных
# - необходимо сохранить транзакцию
conn.commit()
36.
Добавление записей: INSERT# Добавление записей в таблицу ДолжностьОклад
def insert_position(conn, position, salary):
cur = conn.cursor()
cur.execute("INSERT INTO PositionSalary (Position, Salary)"
" VALUES (:position, :salary)",
{'position': position, 'salary': salary})
conn.commit()
# Добавление записей в таблицу Сотрудники
def insert_employee(conn, name, position, bonus, login, pwd):
cur = conn.cursor()
cur.execute("INSERT INTO Employees (Name, Position, Bonus, Login, Password)"
" VALUES (:name, :position, :bonus, :login, :pwd)",
{'name': name, 'position': position, 'bonus': bonus,
'login': login, 'pwd': pwd})
conn.commit()
# Добавление записей в таблицу СотрудникиПроекты
def add_employee_to_project(conn, employee_id, project_id):
cur = conn.cursor()
cur.execute("INSERT INTO EmployeeProject (EmployeeId, ProjectId)"
" VALUES (:employeeId, :projectId)",
{'employeeId': employee_id, 'projectId': project_id})
conn.commit()
37.
Создаем БД ОГО (одной грандиознойорганизации)
db_name = "ogo.db"
db_exists = os.path.exists(db_name)
conn = sqlite3.connect(db_name)
conn.row_factory = sqlite3.Row
if not db_exists:
configure_db(conn)
insert_project(conn, "Важный")
insert_project(conn, "Срочный")
insert_position(conn, "инженер", 50000)
insert_position(conn, "старший инженер", 51000)
insert_position(conn, "менеджер проекта", 100000)
insert_employee(conn, "Иванов И.И.", "инженер", 30000,
"ivanovi", "ivanov123")
insert_employee(conn, "Петров П.П.", "старший инженер", 50000,
"petrovp", "p1e2t3")
insert_employee(conn, "Сидоров С.С.", "менеджер проекта", 30000,
"sidorovs", "zayka88")
add_employee_to_project(conn, 1, 1)
add_employee_to_project(conn, 2, 1)
add_employee_to_project(conn, 2, 2)
add_employee_to_project(conn, 3, 2)
38.
Чтение данных: SELECT# Проверка наличия пользователя в базе данных
# с указанным логином/пролем
def authentication(conn, login, pwd):
cur = conn.cursor()
# Делаем SELECT запрос к базе данных, используя обычный SQL-синтаксис
cur.execute("SELECT E.Id, E.Name, E.Position, EP.ProjectId"
" FROM Employees AS E, EmployeeProject AS EP"
" WHERE E.Id = EP.EmployeeId"
" AND E.Login = :login AND E.Password = :pwd",
{'login': login, 'pwd': pwd})
# Получаем результат сделанного запроса
return cur.fetchone()
# Проверка наличия указанного сотрудника в указанном проекте
def is_employee_in_project(conn, employee_id, project_id):
cur = conn.cursor()
cur.execute("SELECT EP.ProjectId"
" FROM EmployeeProject AS EP"
" WHERE EP.EmployeeId = :employee_id"
" AND EP.ProjectId = :project_id",
{'employee_id': employee_id, 'project_id': project_id})
return bool(cur.fetchone())
39.
Чтение данных: SELECT# Вывод информации для сотрудника
# Соединяем таблицы Employees, PositionSalary
def show_employee_info(conn, employee_id):
cur = conn.cursor()
cur.execute("SELECT E.Id, E.Name, P.Salary + E.Bonus As Pay"
" FROM Employees AS E, PositionSalary AS P"
" WHERE E.Position = P.Position"
" AND E.Id = :employee_id",
{'employee_id': employee_id})
print("Информация для сотрудника:")
for row in cur.fetchall():
print(dict(row))
Id
Employee
Name
Position
Bonus
Login
1 Иванов И.И. инженер
30000 ivanovi
2 Петров П.П. старший инженер
50000 petrovp
3 Сидоров С.С. менеджер проекта
30000 sidorovs
Id
Password
ivanov123
p1e2t3
zayka88
Name
Position
1 Иванов И.И. инженер
2 Петров П.П. старший инженер
3 Сидоров С.С. менеджер проекта
PositionSalary
Position
Salary
инженер
50000
старший инженер
51000
менеджер проекта
100000
Salary
50000
51000
100000
Bonus
30000
50000
30000
40.
Чтение данных: SELECT# Вывод информации для менеджера проекта
# Соединяем таблицы Employees, PositionSalary, EmployeeProject
def show_manager_info(conn, project_id):
cur = conn.cursor()
cur.execute("SELECT E.Id, E.Name, P.Salary + E.Bonus As Pay"
" FROM Employees AS E, PositionSalary AS P, "
"
EmployeeProject AS EP"
" WHERE E.Position = P.Position"
" AND E.Id = EP.EmployeeId"
" AND EP.ProjectId = :project_id",
{'project_id': project_id})
print("Информация для менеджера:")
for row in cur.fetchall():
print(dict(row))
Employee
Id
Name
Position
Bonus
Login
1 Иванов И.И. инженер
30000 ivanovi
2 Петров П.П. старший инженер
50000 petrovp
3 Сидоров С.С. менеджер проекта
30000 sidorovs
Id
Name
Position
1 Иванов И.И. инженер
2 Петров П.П. старший инженер
2 Петров П.П. старший инженер
3 Сидоров С.С. менеджер проекта
Salary
50000
51000
51000
100000
Password
ivanov123
p1e2t3
zayka88
Bonus ProjectID
30000
1
50000
1
50000
2
30000
2
PositionSalary
Position
Salary
инженер
50000
старший инженер
51000
менеджер проекта
100000
EmployeeProject
EmployeeID
ProjectID
1
1
2
1
2
2
3
2
41.
Изменение данных:UPDATE и DELETE
# Изменение премии сотрудника
def update_employee_bonus(conn, employee_id, new_bonus):
cur = conn.cursor()
# Делаем UPDATE запрос к базе данных, используя обычный SQL-синтаксис
cur.execute("UPDATE Employees"
" SET Bonus = :new_bonus"
" WHERE Id = :employee_id",
{'employee_id': employee_id, 'new_bonus': new_bonus})
conn.commit()
# Удаление сотрудника из проекта (но не из базы данных)
def delete_employee_from_project(conn, employee_id, project_id):
cur = conn.cursor()
# Делаем DELETE запрос к базе данных, используя обычный SQL-синтаксис
cur.execute("DELETE FROM EmployeeProject"
" WHERE EmployeeId = :employee_id"
" AND ProjectId = :project_id",
{'employee_id': employee_id, 'project_id': project_id})
conn.commit()
42.
Решение задачи:бета-версия
login = input("Логин: ")
pwd = input("Пароль: ")
res = authentication(conn, login, pwd)
if res:
user = dict(res)
print("Здравствуйте, {}".format(user['Name']))
if user['Position'] == "менеджер проекта":
show_manager_info(conn, user['ProjectId'])
id_upd = int(input("Изменение премии. ID сотрудника (0 - отмена): "))
if id_upd:
if (id_upd != user['Id'] and
is_employee_in_project(conn, id_upd, user['ProjectId'])):
new_bonus = input("Новая премия: ")
update_employee_bonus(conn, id_upd, new_bonus)
else:
print("Невозможно изменить премию для данного сотрудника")
id_del = int(input("Удаление сотрудника. ID сотрудника (0 - отмена): "))
if id_del:
if id_del != user['Id']:
delete_employee_from_project(conn, id_del, user['ProjectId'])
else:
print("Невозможно удалить данного сотрудника из проекта")
else:
show_employee_info(conn, user['Id'])
else:
print("Доступ запрещен")
43.
Решение задачи:тестирование бета-версии
Логин: sidorovs
Пароль: zayka88
Здравствуйте, Сидоров С.С.
Информация для менеджера:
{'Id': 2, 'Name': 'Петров П.П.', 'Pay': 101000}
{'Id': 3, 'Name': 'Сидоров С.С.', 'Pay': 130000}
Изменение премии. ID сотрудника (0 - отмена): 2
Новая премия: 60000
Удаление сотрудника. ID сотрудника (0 - отмена): 0
Логин: sidorovs
Пароль: zayka88
Здравствуйте, Сидоров С.С.
Информация для менеджера:
{'Id': 2, 'Name': 'Петров П.П.', 'Pay': 111000}
{'Id': 3, 'Name': 'Сидоров С.С.', 'Pay': 130000}
Изменение премии. ID сотрудника (0 - отмена): 0
Удаление сотрудника. ID сотрудника (0 - отмена): 2
Логин: sidorovs
Пароль: 123
Доступ запрещен
44.
SQL-инъекции:уязвимый код
def bad_authentication(conn, login, pwd):
cur = conn.cursor()
cur.execute("SELECT E.Id, E.Name, E.Position, EP.ProjectId"
" FROM Employees AS E, EmployeeProject AS EP"
" WHERE E.Id = EP.EmployeeId"
" AND E.Login = '{login}' AND E.Password = '{pwd}'".
format(login=login, pwd=pwd))
return cur.fetchone()
Логин: ivanovi
Пароль: ivanov123
Здравствуйте, Иванов И.И.
Информация для сотрудника:
{'Id': 1, 'Name': 'Иванов И.И.', 'Pay': 80000}
Логин: ivanovi
Пароль: 123
Доступ запрещен
Логин: ivanovi
Пароль: 123' OR 'a'='a
Здравствуйте, Иванов И.И.
Информация для сотрудника:
{'Id': 1, 'Name': 'Иванов И.И.', 'Pay': 80000}
45.
SQL-инъекции:защищенный код
def authentication(conn, login, pwd):
cur = conn.cursor()
cur.execute("SELECT E.Id, E.Name, E.Position, EP.ProjectId"
" FROM Employees AS E, EmployeeProject AS EP"
" WHERE E.Id = EP.EmployeeId"
" AND E.Login = :login AND E.Password = :pwd",
{'login': login, 'pwd': pwd})
return cur.fetchone()
def authentication2(conn, login, pwd):
cur = conn.cursor()
cur.execute("SELECT E.Id, E.Name, E.Position, EP.ProjectId"
" FROM Employees AS E, EmployeeProject AS EP"
" WHERE E.Id = EP.EmployeeId"
" AND E.Login = ? AND E.Password = ?",
(login, pwd))
return cur.fetchone()
Логин: ivanovi
Пароль: 123' OR 'a'='a
Доступ запрещен
46.
Задание• Создайте базу данных db_00, где 00, это ваш номер
• Создайте таблицу Группа gr, sp, year_n
• Создайте таблицу Student с полями id, fam, name, year_b, gr
• Измените структуру, добавьте поле шифр специальности, удалите
специальность, добавьте таблицу Специальность, подумайте
какие там поля
• Добавьте связи между таблицами