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

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

  • автор:

Как удалить строку из базы данных postgresql с помощью запроса на пайтон?

p.s переменная file_name — глобальная. работает в предыщущей функции по сохранению изображения.
как сделать, чтобы у меня удалялась строка? нажимаю, ничего не удаляется, но пайчарм не показывает ошибки.

  • Вопрос задан 27 апр.
  • 90 просмотров

Комментировать
Решения вопроса 1

Alex_Geer

Linux Admin
Попробуйте заменить строку c

ursor.execute("DELETE FROM shop WHERE image = '';")
cursor.execute(f"DELETE FROM shop WHERE image = '';")

Но этот способ не безопасен, так как открывает уязвимость манипулирования данными таблицы через имя файла! Лучше использовать ответ от Василий Банников

Ответ написан 27 апр.

vabka

Не надо так делать, тк мы не знаем, имеет ли конечный пользователь контроль над содержимым переменной deleted_image, или нет — лучше перебдеть и предположить, что есть риск SQL-инъекции.

Удаление одинаковых строк в PostgreSQL

Если получилось, что в таблице отсутствует первичный ключ (primary key), скорее всего, среди записей есть дубликаты. Речь идёт о дублирующихся строках или случаях, когда дублируется одна либо более колонок. Посмотрим на таблицу с информацией о покупателях, где вторая по счёту строка полностью задублирована:

postgre_01_1-20219-e7203b.png

Чтобы удалить все дубликаты, нам подойдёт следующий запрос:

 
DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customers.*);

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

Тут следует заметить, что запрос довольно требователен к ресурсам, что следует учитывать при его использовании на рабочем проекте — просто будьте аккуратны.

В следующей ситуации повторяются значения полей.

postgre_02_1-20219-ee73a1.png

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

 
DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id);

Если же информация важна, сначала давайте найдём записи с дубликатами:

 
SELECT * FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id);

postgre_03_1-20219-c4c0dc.png

До удаления такой записи мы можем перенести её во временную таблицу либо заменить значение customer_id на другое.

Как бы там ни было, общая форма запроса на удаление вышеописанных записей будет выглядеть так:

 
DELETE FROM table_name WHERE ctid NOT IN (SELECT max(ctid) FROM table_name GROUP BY column1, [column 2,] );

Обновление и удаление по номеру строки в таблице

Что Вы подразумеваете под порядковым номером? Результат функции row_number() ? Или поле типа serial ?

18 дек 2013 в 8:14

Ну все записи в таблице записаны по порядку. Первичного ключа может не быть. Посмотрел row_number, годиться в общем-то, только непонятно как им воспользоваться в where инструкции update, пишет "window functions are not allowed in WHERE"

18 дек 2013 в 9:15

Помоему вы делаете что то не верно. Что значит порядковый номер ? А если мы сортировку поменяем, "порядковый номер" укажет уже на другую строку, какую же тогда нуно апдейтить ? Не уверен, но думаю что можно поигратся с: update table set field= LIMIT 10, 1 т.е теоретически должно обновить 10ю строчку.

18 дек 2013 в 10:46

Теоретически update table set field= LIMIT 10 должен обновить первые попавшиеся 10 строк. На практике этот код не отработает, ибо в синтаксисе update нет limit

10 ноя 2015 в 10:44

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

CREATE TABLE test (value text) WITH oids; SELECT oid, value FROM test; UPDATE test SET value='2' WHERE oid=1;

Отслеживать
ответ дан 15 июл 2015 в 14:49
Alexey Slynko Alexey Slynko
359 1 1 серебряный знак 5 5 бронзовых знаков
Если он есть, то данный вариант отлично подойдет
10 ноя 2015 в 10:47

UPDATE table_name SET column_name='value' WHERE row_id=

Удалить: DELETE FROM table_name WHERE row_id=

  • table_name - имя таблицы, в которой производим действия
  • column_name - столбец, который обновляем
  • row_id - подразумевает id строки, над которой вы производите действия. Например, если у вас есть в таблице столбец id, его смело можно использовать здесь
  • your_value - значение, по которому вы осуществляете поиск строки для обновления или удаления.

Отслеживать
ответ дан 18 дек 2013 в 5:53
3,799 18 18 серебряных знаков 28 28 бронзовых знаков
Первичного ключа в таблице может не быть
18 дек 2013 в 8:58

Нет такого понятия, как порядковый номер записи в таблице

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

Если есть первычный ключ, то логичнее использовать его. Если его нет, то как уже упоминалось в ответе Alexey Slynko, можно воспользоваться уникальным системным идентификатором строки, oid, опять таки, если он есть. Ну а если нет ни того, ни другого, то только по уникальной комбинации полей записи, например, так

update test set field_1 = value where (field_1, field_2, field_3) = (value_1, value_2, value_3) 

PostgreSQL оператор DELETE

В этом учебном пособии вы узнаете, как использовать PostgreSQL оператор DELETE с синтаксисом и примерами.

Описание

Оператор PostgreSQL DELETE используется для удаления одной или нескольких записей из таблицы в PostgreSQL.

Синтаксис

Синтаксис оператора DELETE в PostgreSQL:

DELETE FROM table
[WHERE conditions];

Параметры или аргументы

table Таблица, из которой вы хотите удалить записи. WHERE conditions Необязательный. Условия, которые должны быть выполнены для удаления записей. Если никаких условий не предоставлено, все записи из таблицы будут удалены.

Примечание

  • Вам не нужно перечислять поля в PostgreSQL операторе DELETE, поскольку вы удаляете всю строку из таблицы.

Пример - с одним условием

Рассмотрим простой пример, где у нас есть только одно условие в операторе DELETE.
Например:

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

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