我有一个跟踪项目并使用SQLObject
python ORM
的应用程序。在某个时间点app检查表是否不是太大,如果表中的项超过10000个,它会删除第一个N
项,因此表中有10000个项。通过SQLObject
写下来的优雅而有效的方法是什么?我追求的所有解决方案都很缓慢而且很尴尬:(。
答案 0 :(得分:1)
我个人没有使用SQLOBJECT
。因此,这是一个基于ordering records by inserted date
的简单删除语句,最早的N
记录将被删除,并且它位于MYSQL
中。无法设置limit
clause using a variable due to this bug,因此我使用了最直接的方法。
对于此样本,我使用阈值6
,因为很难有10000
...
样本表:
COL1 COL2
1 112
2 0
3 20
4 10
5 100
6 30
7 200
8 108
set @table_count:=0;
set @excess_count:=0;
select count(*) into @table_count
from tablex;
select (case when @table_count > 6
then (@table_count -6)
else 0 end) into @excess_count
;
select *
from tablex
where col1 between 1 and @excess_count
order by col1 asc
;
选择的记录:
COL1 COL2
1 112
2 0
以上查询按col1
对记录进行排序,您可以根据自己的情况对其进行更改。因此,删除查询可以建立在最后select
上。所以最好写一个storedprocedure ...因为这是一堆 akward 语句......
答案 1 :(得分:1)
我知道这个帖子已经过时了,但我想发布一个条目,以防有人通过谷歌搜索遇到它,就像我一样。
我有一个类似的问题,我需要自定义删除调用。 SQLObject为您提供了两个使用custom where子句创建SQL DELETE的选项:
我选择了第二个选项,因为它更加灵活和简化:
dsqlMetricseries._connection.query("DELETE FROM dsql_metricseries WHERE metric_id = %s"%metric_id)
答案 2 :(得分:0)
如上所述,我意识到这是一个旧帖子,但其他观众可能会觉得这很有用。 我不确定切片选择的效率如何(假设在添加记录时记录ID是递增的)。
myselect = tableobject.select(orderBy=tableobject.q.id)
if myselect.count() > 10000:
tableobject.deleteMany(tableobject.q.id<myselect[10001].id)
未经测试,但我经常使用deleteMany()。