SQLObject:如何从表中删除前N个对象?

时间:2013-01-04 13:52:42

标签: python sql orm sqlobject

我有一个跟踪项目并使用SQLObject python ORM的应用程序。在某个时间点app检查表是否不是太大,如果表中的项超过10000个,它会删除第一个N项,因此表中有10000个项。通过SQLObject写下来的优雅而有效的方法是什么?我追求的所有解决方案都很缓慢而且很尴尬:(。

3 个答案:

答案 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)
  • dsqlMetricseries:SQLObject子类,表示数据库表的模型类
  • _connection:处理SQLObject的内部数据库连接
  • query:用于执行任何SQL语句的SQLObject方法

答案 2 :(得分:0)

如上所述,我意识到这是一个旧帖子,但其他观众可能会觉得这很有用。 我不确定切片选择的效率如何(假设在添加记录时记录ID是递增的)。

myselect = tableobject.select(orderBy=tableobject.q.id)
if myselect.count() > 10000:
    tableobject.deleteMany(tableobject.q.id<myselect[10001].id)

未经测试,但我经常使用deleteMany()。