CRUD операции

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

В этом тренажёре вы шаг за шагом разберёте базовые операции работы с базой данных из Python: создание, чтение, обновление и удаление записей (CRUD). Сначала вы сопоставите аббревиатуру CRUD с конкретными SQL-командами, затем потренируетесь дописывать недостающие фрагменты кода и исправлять типичные ошибки в запросах и работе с модулем sqlite3. Далее вы соберёте из частей функции для вставки и выборки данных, расставите в правильном порядке шаги подключения к базе, выполнения запроса и закрытия соединения. Отдельные задания посвящены безопасным параметризованным запросам и тому, как операции INSERT, UPDATE, DELETE и транзакции влияют на итоговый результат выборки. Форматы заданий разные: от заполнения пропусков и поиска ошибок до сортировки и предсказания результата выполнения кода. Это помогает не только запомнить синтаксис, но и лучше понять логику работы CRUD-операций.

Список тем

Соотнесите CRUD-операции и SQL-запросы

id: 40178_task1

Нужно сопоставить каждую операцию из набора CRUD с примером SQL-запроса, который эту операцию реализует. В левой колонке описаны действия над данными, в правой — фрагменты запросов. Перетащите правые элементы так, чтобы они логично соответствовали операциям Create, Read, Update и Delete.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
C (Create) — создание новой строки с данными
R (Read) — чтение уже существующих строк
U (Update) — изменение значений полей
D (Delete) — удаление строк из таблицы
INSERT INTO users (name) VALUES ('Ann');
SELECT name FROM users;
UPDATE users SET name = 'Ann' WHERE id = 1;
DELETE FROM users WHERE id = 1;
Сообщения
Проверить
Показать подсказку

Базовые операции с sqlite3: допишите методы

id: 40178_task2

Перед вами короткий пример работы с базой 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])
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Исправьте запрос UPDATE с параметрами

id: 40178_task3

Ниже приведён фрагмент кода, который должен обновлять возраст конкретного пользователя по его id. В строке с вызовом cursor.execute допущены две ошибки: опечатка в ключевом слове SQL и неверное использование параметров. Исправьте строку так, чтобы запрос корректно обновлял возраст пользователя с указанным id.

Найдите ошибку и исправьте
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
user_id = 1
new_age = 30
cursor.execute("UPDTAE users SET age = ? WHERE id = user_id", (new_age,))
conn.commit()
conn.close()
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сколько строк останется после DELETE и UPDATE?

id: 40178_task4

В этом примере создаётся таблица 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)
Сообщения
Проверить
Показать подсказку

Соберите функцию вставки пользователя

id: 40178_task5

Нужно собрать из предложенных строк функцию 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))
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Последовательность шагов чтения из базы

id: 40178_task6

Перед вами набор строк кода, иллюстрирующих типичный сценарий чтения данных из базы 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-операции

id: 40178_task7

Ниже в виде таблицы показаны четыре заготовки 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;
INSERT INTO
SELECT
UPDATE
DELETE FROM
SET name = 'Bob' WHERE id = 1
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Параметризованный SELECT по имени пользователя

id: 40178_task8

Фрагмент кода должен выбрать одну запись из таблицы users по имени, используя безопасный параметризованный запрос. В теле запроса используется уже объявленная переменная name. В двух местах оставлены пропуски: вместо выражения в WHERE и вместо значения в кортеже параметров. Заполните их так, чтобы запрос был параметризованным, а не подставлял имя напрямую в строку.

Заполните пропуски
name = "Ann"
cursor.execute("SELECT * FROM users WHERE name = input1S", (input2S,))
row = cursor.fetchone()
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Разделите запросы на чтение и изменение данных

id: 40178_task9

В списке ниже перемешаны SQL-запросы, некоторые из них только читают данные, а другие изменяют содержимое таблицы users. Ваша задача — разнести запросы по двум группам: те, которые относятся к чтению (Read), и те, которые создают, обновляют или удаляют строки (Create/Update/Delete).

Перетяните элементы в соответствующие блоки
Только чтение (Read)
Изменение данных (Create/Update/Delete)
SELECT name FROM users;
INSERT INTO users (name) VALUES ('Ann');
UPDATE users SET name = 'Bob' WHERE id = 1;
DELETE FROM users WHERE id = 1;
SELECT COUNT(*) FROM users;
SELECT * FROM users WHERE id = 5;
Сообщения
Проверить
Показать подсказку

Сколько строк вернёт SELECT после вставки и удаления?

id: 40178_task10

Код ниже создаёт таблицу 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-инъекцию

id: 40178_task11

Функция 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)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Как транзакция с commit и rollback влияет на количество строк?

id: 40178_task12

В коде ниже в базе в памяти создаётся таблица 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])
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру