2013-04-01 4 views
0

Я использую psycopg2 с Python.Удалить все данные из таблицы, но последние N записей

Я хотел бы периодически промывать данные из моего db. Для этого я поставил задачу с Timer. Раньше я спрашивал this question, но, используя указанный там ответ, замораживает мою машину (клавиатура перестает отвечать на запросы и целая система рубит останавливается). Вместо этого я хотел бы удалить все записи в моей таблице, хотя и последний N (не уверен, что это правильный подход).

В принципе, существует еще один выполняемый python-процесс (отдельный исполняемый файл), который заполняет db, который я хочу опросить. Кажется, что если я удалю все записи и что другой процесс запущен, это может привести к замораживанию. Я не знаю, насколько безопасным способом я могу удалить записи; это почти так, как если бы другой процесс полагался на инкрементирующий идентификатор, когда он записывал в db.

Если бы кто-нибудь мог помочь мне разобраться в этом, мы будем очень благодарны. Мысли?

ответ

1

Это, вероятно, намного быстрее:

CRETE TEMP TABLE tbl_tmp AS 
SELECT * FROM tbl ORDER BY <undisclosed> LIMIT <N>; 

TRUNCATE TABLE tbl; 
INSERT INTO tbl SELECT * FROM tbl_tmp; 

сделать все это в один сессии. Специфика зависит от дополнительных обстоятельств, которые вы не раскрывали.

Сравните с этим родственным исчерпывающий ответ (ваш случай проще):
Remove duplicates from table based on multiple criteria and persist to other table

2

Возможное решение - запустить DELETE на всех идентификаторах, кроме тех, которые были возвращены select ... order by pk desc limit N с учетом автоинкрементального pk. Если такой pk не существует, наличие created_date и его заказы должны делать то же самое.

Non испытания пример:

import psycopg2 
connection = psycopg2.connect('dbname=test user=postgres') 
cursor = conn.cursor() 

query = 'delete from my_table where id not in (
      select id from my_table order by id desc limit 30)' 
cursor.execute(query) 
cursor.commit() #Don't know if necessary 
cursor.close() 
connection.close() 
+0

Спасибо. Не могли бы вы привести мне пример? – jml

+0

@jml добавил пример. – Mariano

+0

как часто вы будете называть cursor.close()? – jml

Смежные вопросы