Как удалить строку в sqlite
Перейти к содержимому

Как удалить строку в sqlite

  • автор:

Как удалить строку в sqlite

Команда DELETE удаляет данные из БД. Она имеет следующий формальный синтаксис:

DELETE FROM имя_таблицы [WHERE условие_удаления]

Например, возьмем следующую таблицу products, которая хранит некоторый набор товаров:

CREATE TABLE products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, company TEXT NOT NULL, product_count INTEGER DEFAULT 0, price INTEGER ); INSERT INTO products (name, company, product_count, price) VALUES ('iPhone 13', 'Apple', 3, 76000), ('iPhone 12', 'Apple', 2, 51000), ('Galaxy S21', 'Samsung', 2, 56000), ('Galaxy S20', 'Samsung', 1, 41000), ('P40 Pro', 'Huawei', 5, 36000);

Удалим из этой таблицы товары, у которых производитель — Huawei:

DELETE FROM products WHERE company='Huawei';

Команда DELETE в SQLite

Или удалим все товары, производителем которых является Apple и которые имеют цену меньше 60000:

DELETE FROM products WHERE company='Apple' AND price < 60000;

Если необходимо вовсе удалить все строки вне зависимости от условия, то условие можно не указывать:

DELETE FROM products;

Как удалить строку в SQLite, чтобы не удалить "индекс"

При определенных условиях нужно удалять строки с данными о пользователях, соответственно вместе с ними будет удаляться id с "порядковым номером" пользователя, то есть на старте есть таблица:

1 мужской 20 темный 2 женский 15 светлый 3 женский 30 рыжий 

После удаления второй строки остается:

1 мужской 20 темный 3 женский 30 рыжий 

Можно ли как-то сделать, чтобы осталось:

1 мужской 20 темный 2 женский 30 рыжий 

Нужно это для того, что внутри программы запускается цикл по id и выполняются определенные операции, соответственно, если ставлю цикл

for i in range(len(количество строк)) 

То количество строк остается 2, но присутствует 3, не могу c данными работать по i А если сначала получить данные, например, в переменную string о всех строках, а потом их обрабатывать, то:

for i in sting 

Не могу обращаться по id к строкам, а мне это нужно в моей задаче Сама задача: Есть написанный Telegram-бот, который подбирает кастинги по заданным характеристикам для моделей. Есть таблица с характеристиками моделей, которая заполняется по мере работы пользователя с ботом, есть таблица с кастингами, которую заполняют менеджеры также через бота Таблицы идентичны по виду, так как заполнение происходит по кнопкам, то есть таблица кастингов выглядит:

id (номер кастинга) casting gender age и тд (данные, которые указаны в кастинге) 

В отдельных строках они, потому что по ним идет сравнение с характеристиками моделей. Каждые два дня старые кастинги должны удаляться, что и приводит к сдвигу по id (для меня проще называть "порядковому номеру кастинга"), но когда пользователь нажимает кнопку "Найти кастинг", должен сработать цикл, бегущий по всем кастингам, а по id кастинга, который равен счетчику цикла, происходит работа с данными (сверяются на соответствие с данными пользователя) Бот функционировал ранее без проблем, сейчас просто происходит его улучшение и расширение, в связи с чем столкнулась с необходимостью работать по id, а не по тексту кастинга, как ранее Не знаю, понятно ли смогла задать вопрос, буду рада помощи! Заранее спасибо!

Как удалить несколько строчек данных SQLite в Python?

И так, мне нужно удалить одну строчку данных в sqlite таблице, но как это сделать, не могу сообразить. И так в таблице имеются следующие данные5fe37300289fd121921226.png
Мне нужно удалить эту строку
5fe37335d3856502706409.png
В интернете везде пример удаления следующие
5fe3739b259ea286176847.png
Но это команда удалит все строчки, где присутствует Finance в столбце department_name. Но мне нужно сделать так:
id = 674759776
Если id_1 == с моим id
То удалить строчку данных где присутствует мой id. То есть следующую строчку
5fe3745bea9a5130009991.png
Как это можно сделать?

  • Вопрос задан более трёх лет назад
  • 414 просмотров

1 комментарий

Простой 1 комментарий

SoreMix

soremix @SoreMix Куратор тега Python
Заменить Finance на нужный ID, а department_name на id_1?
Решения вопроса 1

150_Kirill_150

Kir Mozor @150_Kirill_150 Автор вопроса
FX, Python, C# (Unity), Coding, адепт Linux
Короче проблемку решил следующим образом:

import sqlite3 conn = sqlite3.connect("local.db", check_same_thread = False) # или :memory: чтобы сохранить в RAM cursor = conn.cursor() my_id = 74654758345 cursor.execute('SELECT id_2 FROM stol_game WHERE id_1 = ?', (my_id, )) id_2_turtle = cursor.fetchone() id_2 = int(id_2_turtle[0]) cursor.execute('SELECT brosokone2 FROM stol_game WHERE id_1 = ?', (my_id, )) brosokone2turtle = cursor.fetchone() brosokone2 = int(brosokone2turtle[0]) cursor.execute('SELECT brosoktwo2 FROM stol_game WHERE id_1 = ?', (my_id, )) brosoktwo2turtle = cursor.fetchone() brosoktwo2 = int(brosoktwo2turtle[0]) cursor.execute('SELECT vsumme2 FROM stol_game WHERE id_1 = ?', (my_id, )) vsumme2turtle = cursor.fetchone() vsumme2 = int(vsumme2turtle[0]) cursor.execute('SELECT stavka2 FROM stol_game WHERE id_1 = ?', (my_id, )) stavka2turtle = cursor.fetchone() stavka2 = int(stavka2turtle[0]) cursor.execute('SELECT frend_id FROM stol_game WHERE id_1 = ?', (my_id, )) frend_id2turtle = cursor.fetchone() frend_id = int(frend_id2turtle[0]) cursor.execute('SELECT brosokone1 FROM stol_game WHERE id_1 = ?', (my_id, )) brosokone1turtle = cursor.fetchone() brosokone1 = int(brosokone1turtle[0]) cursor.execute('SELECT brosoktwo1 FROM stol_game WHERE id_1 = ?', (my_id, )) brosoktwo1turtle = cursor.fetchone() brosoktwo1 = int(brosoktwo1turtle[0]) cursor.execute('SELECT vsumme1 FROM stol_game WHERE id_1 = ?', (my_id, )) vsumme1turtle = cursor.fetchone() vsumme1 = int(vsumme1turtle[0]) cursor.execute('SELECT stavka1 FROM stol_game WHERE id_1 = ?', (my_id, )) stavka1turtle = cursor.fetchone() stavka1 = int(stavka1turtle[0]) cursor.execute('SELECT win FROM stol_game WHERE id_1 = ?', (my_id, )) win2turtle = cursor.fetchone() win = int(win2turtle[0]) cursor.execute('DELETE FROM stol_game WHERE id_1 = ? AND frend_id = ? AND brosokone1 = ? AND brosoktwo1 = ? AND vsumme1 = ? AND stavka1 = ? AND id_2 = ? AND brosokone2 = ? AND brosoktwo2 = ? AND vsumme2 = ? AND stavka2 = ? AND win = ?', (my_id, frend_id, brosokone1, brosoktwo1, vsumme1, stavka1, id_2, brosokone2, brosoktwo2, vsumme2, stavka2, win, )) conn.commit()

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2
plyshk1n2k @plyshk1n2k

Не пробовал добавить еще одно условие в запрос к бд?
У строк же разные id_1 и id_2
Или же можно использовать TOP, LIMIT, ROWNUM
Если ты уверен, что в бд на первой строке именно то что тебе нужно и тебе следует ее удалить, тогда смело используй то что я описал строчкой выше

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Но это команда удалит все строчки, где присутствует Finance в столбце department_name.
Ну так в чём проблема-то ? нужно, чтобы присутствовало нужное число в нужном столбце
DELETE FROM departments
WHERE id_1=674759776

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

sqlite

  • SQLite

Как объединить два запроса SELECT?

  • 1 подписчик
  • 2 часа назад
  • 12 просмотров

python

  • Python
  • +3 ещё

Как получать данные из WebApp?

  • 1 подписчик
  • 6 часов назад
  • 20 просмотров

Удаление записей из таблицы SQLite

Этот материал посвящен выполнению SQL-операции DELETE для SQLite-таблицы из Python-приложения.

В этой статье мы рассмотрим:

  • Удаление одной, нескольких или всех строк или колонок из SQLite-таблицы с помощью Python;
  • Использование запроса с параметрами для выполнения операции удаления из SQLite;
  • Коммит и отмена последней операции;
  • Массовое удаление в один запрос.

Подготовка

Перед выполнением следующих операций нужно знать название таблицы SQLite, а также ее колонок. В этом материале будет использоваться таблица sqlitedb_developers .

Пример удаления одной строки из SQLite-таблицы

Сейчас таблица sqlitedb_developers содержит шесть строк, а удалять будем разработчика, чей id равен 6. Вот что для этого нужно сделать:

  • Присоединиться к SQLite из Python;
  • Создать объект Cursor с помощью полученного в прошлом шаге объекта соединения SQLite;
  • Создать DELETE-запрос для SQLite. Именно на этом этапе нужно знать названия таблицы и колонок;
  • Выполнить DELETE-запрос с помощью cursor.execute() ;
  • После выполнения запроса необходимо закоммитить изменения в базу данных;
  • Закрыть соединение с базой данных;
  • Также важно не забыть перехватить исключения, которые могут возникнуть;
  • Наконец, проверить результат операции.
 
import sqlite3

def delete_record():
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")

sql_delete_query = """DELETE from sqlitedb_developers where /> cursor.execute(sql_delete_query)
sqlite_connection.commit()
print("Запись успешно удалена")
cursor.close()

except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")

delete_record()

Вывод: таблица sqlitedb_developers после удаления строки из Python.

Подключен к SQLite Запись успешно удалена Соединение с SQLite закрыто

Разбор примера в подробностях

  • На этой строке модуль sqlite3 импортируется в программу;
  • С помощью классов и методов sqlite3 можно взаимодействовать с базой данных SQLite.

sqlite3.connect() и connection.cursor() :

  • С помощью sqlite3.connect() устанавливается соединение с базой данных SQLite из Python;
  • Дальше используется sqliteConnection.cursor() для получения объекта Cursor .

После этого создается DELETE-запрос для удаления шестой строки в таблице (для разработчика с id равным 6). В запросе этот разработчик упоминается.

  • Выполняется операция из DELETE-запроса с помощью метода execute() объекта Cursor ;
  • После успешного удаления записи изменения коммитятся в базу данных с помощью connection.commit() .

Наконец, закрываются Cursor и SQLite-соединение в блоке finally .

Примечание: если выполняется несколько операций удаления, и есть необходимость отменить все изменения в случае неудачи хотя бы с одной из них, нужно использовать функцию rollback() класса соединения для отмены. Эту функцию стоит применять внутри блока except .

Использование переменных в запросах для удаления строки

В большинстве случаев удалять строки из таблицы SQLite нужно с помощью ключа, который передается уже во время работы программы. Например, когда пользователь удаляет свою подписку, запись о нем нужно удалить из таблицы.

В таких случаях требуется использовать запрос с параметрами. В таких запросах на месте будущих значений ставятся заполнители ( ? ). Это помогает удалять записи, получая значения во время работы программы, и избегать проблем SQL-инъекций. Вот пример с удалением разработчика с id=5 .

 
import sqlite3

def delete_sqlite_record(dev_id):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")

sql_update_query = """DELETE from sqlitedb_developers where /> cursor.execute(sql_update_query, (dev_id, ))
sqlite_connection.commit()
print("Запись успешно удалена")
cursor.close()

except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")

delete_sqlite_record(5)

Вывод: таблица sqlitedb_developers после удаления строки с помощью запроса с параметрами.

Подключен к SQLite Запись успешно удалена Соединение с SQLite закрыто

Разберем последний пример:

  • Запрос с параметрами использовался, чтобы получить id разработчика во время работы программы и подставить его на место ? . Он определяет id записи, которая будет удалена.
  • После этого создается кортеж данных с помощью переменных Python.
  • Дальше DELETE-запрос вместе с данными передается в метод cursor.execute() .
  • Наконец, изменения сохраняются в базе данных с помощью метода commit() класса Connection .

Операция Delete для удаления нескольких строк

В примере выше был использован метод execute() объекта Cursor для удаления одной записи, но часто приходится удалять сразу несколько одновременно.

Вместо выполнения запроса DELETE каждый раз для каждой записи, можно выполнить операцию массового удаления в одном запросе. Удалить несколько записей из SQLite-таблицы в один запрос можно с помощью метода cursor.executemany() .

Метод cursor.executemany(query, seq_param) принимает два аргумента: SQL-запрос и список записей для удаления.

Посмотрим на следующий пример. В нем удаляются сразу три разработчика.

 
import sqlite3

def delete_multiple_records(ids_list):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")

sqlite_update_query = """DELETE from sqlitedb_developers where /> cursor.executemany(sqlite_update_query, ids_list)
sqlite_connection.commit()
print("Удалено записей:", cursor.rowcount)
sqlite_connection.commit()
cursor.close()

except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")

ids_to_delete = [(4,),(3,)]
delete_multiple_records(ids_to_delete)
Подключен к SQLite далено записей: 2 Соединение с SQLite закрыто

Разберем последний пример:

  • После соединения с базой данных SQLite готовится SQL-запрос с параметрами и одним заполнителем. Вместе с ним также передается список id в формате кортежа.
  • Каждый элемент списка — это всего лишь кортеж каждой строки. Каждый кортеж содержит id разработчика. В этом примере три кортежа — то есть, три разработчика.
  • Дальше вызывается cursor.executemany(sqlite_delete_query, ids_list) для удаления нескольких записей из таблицы. И запрос, и список id передаются cursor.executemany() в качестве аргументов.
  • Чтобы увидеть количество затронутых записей, можно использовать метод cursor.rowcount . Наконец, изменения сохраняются в базу данных с помощью метода commit класса Connection .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *