我正在使用psycopg2和Python。
我想定期刷新数据库中的数据。我为Timer
设置了一个任务。之前我曾问过this question,但是使用那里列出的答案冻结了我的机器(键盘停止响应,整个系统停止研磨)。相反,我想删除我表中的所有条目,尽管是最后一个N(不确定这是正确的方法)。
基本上,还有另一个正在运行的python进程(单独的可执行文件),它正在填充我想要查询的数据库。似乎如果我删除所有条目,并且其他进程正在运行,则可能导致冻结。我不知道我可以删除条目的安全方式;这几乎就好像其他进程在写入db时依赖于递增ID。
如果有人能帮我解决这个问题,我们将不胜感激。想法?
答案 0 :(得分:2)
一种可能的解决方案是在所有ID上运行DELETE
,除了select ... order by pk desc limit N
给出的自动增量pk返回的值。如果不存在这样的pk,那么拥有created_date
并按其排序也应该这样做。
未经测试的例子:
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()
答案 1 :(得分: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