В этом тренажёре вы шаг за шагом разберёте базовые операции работы с базой данных из Python: создание, чтение, обновление и удаление записей (CRUD). Сначала вы сопоставите аббревиатуру CRUD с конкретными SQL-командами, затем потренируетесь дописывать недостающие фрагменты кода и исправлять типичные ошибки в запросах и работе с модулем sqlite3. Далее вы соберёте из частей функции для вставки и выборки данных, расставите в правильном порядке шаги подключения к базе, выполнения запроса и закрытия соединения. Отдельные задания посвящены безопасным параметризованным запросам и тому, как операции INSERT, UPDATE, DELETE и транзакции влияют на итоговый результат выборки. Форматы заданий разные: от заполнения пропусков и поиска ошибок до сортировки и предсказания результата выполнения кода. Это помогает не только запомнить синтаксис, но и лучше понять логику работы CRUD-операций.
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- CRUD операции.
- Параметризованные запросы.
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Соотнесите CRUD-операции и SQL-запросы
Нужно сопоставить каждую операцию из набора CRUD с примером SQL-запроса, который эту операцию реализует. В левой колонке описаны действия над данными, в правой — фрагменты запросов. Перетащите правые элементы так, чтобы они логично соответствовали операциям Create, Read, Update и Delete.
Базовые операции с sqlite3: допишите методы
Перед вами короткий пример работы с базой SQLite: подключение, создание таблицы, вставка и чтение данных. В коде пропущены имена нескольких методов объекта соединения и курсора. Ваша задача — вписать названия этих методов без скобок так, чтобы код создавал таблицу, добавлял пользователя и считывал его имя.
import sqlite3
conn = sqlite3.connect('example.db')
cur = conn.input1S()
cur.input2S("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cur.input2S("INSERT INTO users (name) VALUES ('Alice')")
conn.input3S()
cur.input2S("SELECT name FROM users")
rows = cur.input4S()
print(rows[0][0])Исправьте запрос UPDATE с параметрами
Ниже приведён фрагмент кода, который должен обновлять возраст конкретного пользователя по его id. В строке с вызовом cursor.execute допущены две ошибки: опечатка в ключевом слове SQL и неверное использование параметров. Исправьте строку так, чтобы запрос корректно обновлял возраст пользователя с указанным id.
import sqlite3conn = sqlite3.connect('example.db')cursor = conn.cursor()user_id = 1new_age = 30cursor.execute("UPDTAE users SET age = ? WHERE id = user_id", (new_age,))conn.commit()conn.close()Сколько строк останется после DELETE и UPDATE?
В этом примере создаётся таблица users в памяти, добавляются две записи, затем одна строка удаляется, а оставшаяся переименовывается. В конце выполняется запрос SELECT COUNT(*) и выводится количество строк в таблице. Выберите, какое число будет выведено в результате выполнения программы.
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO users (name) VALUES ('Ann')")
cur.execute("INSERT INTO users (name) VALUES ('Bob')")
cur.execute("DELETE FROM users WHERE name = 'Ann'")
cur.execute("UPDATE users SET name = 'Charlie' WHERE name = 'Bob'")
cur.execute("SELECT COUNT(*) FROM users")
count = cur.fetchone()[0]
print(count)Соберите функцию вставки пользователя
Нужно собрать из предложенных строк функцию insert_user, которая принимает соединение и данные пользователя, вставляет запись в таблицу users, фиксирует изменения и возвращает id добавленной строки. Некоторые строки лишние: они не соответствуют заданному описанию функции. Соберите только необходимые строки в правильном порядке.
cursor = conn.cursor() conn.commit()def insert_user(conn, name, age): print('Inserted') conn.close() return cursor.lastrowid cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))Последовательность шагов чтения из базы
Перед вами набор строк кода, иллюстрирующих типичный сценарий чтения данных из базы SQLite: импорт модуля, подключение к файлу базы, создание курсора, выполнение SELECT, получение всех строк, вывод результата и закрытие соединения. Переставьте строки так, чтобы получился рабочий и логичный фрагмент кода.
rows = cursor.fetchall()conn.close()cursor.execute("SELECT name FROM users")for row in rows:import sqlite3 print(row[0])conn = sqlite3.connect('example.db')cursor = conn.cursor()Подставьте SQL-команды для каждой CRUD-операции
Ниже в виде таблицы показаны четыре заготовки SQL-запросов для операций создания, чтения, обновления и удаления строк в таблице users. Вместо ключевых слов стоят пропуски. В банке токенов даны готовые фрагменты SQL. Ваша задача — перетащить подходящие токены в каждое поле так, чтобы получились корректные примеры запросов для C, R, U и D.
| Операция | Пример запроса |
|---|---|
| Create (C) | input1S users (name) VALUES ('Ann'); |
| Read (R) | input2S * FROM users; |
| Update (U) | input3S users input4S; |
| Delete (D) | input5S users WHERE id = 10; |
Параметризованный SELECT по имени пользователя
Фрагмент кода должен выбрать одну запись из таблицы users по имени, используя безопасный параметризованный запрос. В теле запроса используется уже объявленная переменная name. В двух местах оставлены пропуски: вместо выражения в WHERE и вместо значения в кортеже параметров. Заполните их так, чтобы запрос был параметризованным, а не подставлял имя напрямую в строку.
name = "Ann"
cursor.execute("SELECT * FROM users WHERE name = input1S", (input2S,))
row = cursor.fetchone()Разделите запросы на чтение и изменение данных
В списке ниже перемешаны SQL-запросы, некоторые из них только читают данные, а другие изменяют содержимое таблицы users. Ваша задача — разнести запросы по двум группам: те, которые относятся к чтению (Read), и те, которые создают, обновляют или удаляют строки (Create/Update/Delete).
Сколько строк вернёт SELECT после вставки и удаления?
Код ниже создаёт таблицу items в оперативной памяти, вставляет в неё несколько записей, одну из них удаляет, затем делает выборку всех строк и печатает количество полученных записей. Посчитайте, сколько строк останется после всех операций, и введите в поле число, которое выведет программа.
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE items (id INTEGER PRIMARY KEY, title TEXT)")
cur.execute("INSERT INTO items (title) VALUES ('A')")
cur.execute("INSERT INTO items (title) VALUES ('B')")
cur.execute("INSERT INTO items (title) VALUES ('C')")
cur.execute("DELETE FROM items WHERE title = 'B'")
cur.execute("SELECT * FROM items")
rows = cur.fetchall()
print(len(rows))Сделайте поиск пользователя безопасным: уберите SQL-инъекцию
Функция find_user должна искать пользователя по имени, используя курсор базы данных. Сейчас в ней используется f-строка, которая напрямую подставляет значение name в SQL. Такое решение уязвимо для SQL-инъекций. Исправьте функцию так, чтобы она использовала параметризованный запрос с placeholder'ом и передачей значения во втором аргументе cursor.execute.
def find_user(cursor, name): query = f"SELECT * FROM users WHERE name = '{name}'" cursor.execute(query)Как транзакция с commit и rollback влияет на количество строк?
В коде ниже в базе в памяти создаётся таблица users. Сначала вставляется одна запись и изменения фиксируются вызовом commit. Затем добавляется ещё одна запись, но после этого вызывается rollback, а не commit. В конце выполняется SELECT COUNT(*) и выводится количество строк. Выберите, какое число напечатает программа.
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO users (name) VALUES ('Ann')")
conn.commit()
cur.execute("INSERT INTO users (name) VALUES ('Bob')")
conn.rollback()
cur.execute("SELECT COUNT(*) FROM users")
print(cur.fetchone()[0])