0

我正在将 psycopg2 与 Python 一起使用。

我想定期从我的数据库中刷新数据。我Timer为此设置了一个任务。我以前问过这个问题,但是使用那里列出的答案会冻结我的机器(键盘停止响应,整个系统停止运行)。相反,我想删除表中的所有条目,尽管最后一个 N (也不确定这是否是正确的方法)。

基本上,还有另一个 python 进程正在运行(单独的可执行文件),它正在填充我希望询问的数据库。似乎如果我删除所有条目,并且其他进程正在运行,它可能会导致冻结。我不知道删除条目的安全方法;几乎就好像另一个进程在写入数据库时​​依赖于递增的 ID。

如果有人可以帮助我解决这个问题,将不胜感激。想法?

4

2 回答 2

2

一个可能的解决方案是在所有 id 上运行 a DELETE,除了select ... order by pk desc limit N给定的自动增量 pk 返回的那些。如果不存在这样的 pk,则拥有 acreated_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()
于 2013-04-01T03:56:21.433 回答
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;

一个会话中完成所有操作。具体情况取决于您未披露的其他情况。

与这个相关的综合答案相比(您的情况更简单):
根据多个条件从表中删除重复项并保留到其他表

于 2013-04-01T13:14:16.010 回答